我在mongodb中有大约170万份文件(将来10m +).其中一些代表我不想要的重复条目.文档的结构是这样的:
{
_id: 14124412,
nodes: [
12345,
54321
],
name: "Some beauty"
}
Run Code Online (Sandbox Code Playgroud)
如果文档至少有一个节点与具有相同名称的另一个文档相同,则文档是重复的.删除重复项的最快方法是什么?
我创建了一个集合并添加了一个这样的唯一键
db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true,dropDups: true})
Run Code Online (Sandbox Code Playgroud)
该集合看起来像这样的"user_services"
{
"_id" : ObjectId("55068b35f791c7f81000002d"),
"uid" : 15,
"sid" : 1,
"rate" : 5
},
{
"_id" : ObjectId("55068b35f791c7f81000002f"),
"uid" : 15,
"sid" : 1,
"rate" : 4
}
Run Code Online (Sandbox Code Playgroud)
问题:
我使用php驱动程序插入具有相同的uid和sid的文档,它正在插入.
我想要的是
我正在使用MongoDB,需要删除重复的记录.我有一个看起来像这样的列表集合:(简化)
[
{ "MlsId": "12345"" },
{ "MlsId": "12345" },
{ "MlsId": "23456" },
{ "MlsId": "23456" },
{ "MlsId": "0" },
{ "MlsId": "0" },
{ "MlsId": "" },
{ "MlsId": "" }
]
Run Code Online (Sandbox Code Playgroud)
如果MlsId不是""或"0"而另一个列表具有相同的MlsId,则列表是重复的.因此,在上面的示例中,需要删除第2和第4条记录.
我如何找到所有重复的列表并将其删除?我开始查看MapReduce,但找不到适合我的情况的示例.
这是我到目前为止,但它没有检查MlsId是"0"还是"":
m = function () {
emit(this.MlsId, 1);
}
r = function (k, vals) {
return Array.sum(vals);
}
res = db.Listing.mapReduce(m,r);
db[res.result].find({value: {$gt: 1}});
db[res.result].drop();
Run Code Online (Sandbox Code Playgroud) 我已经看到了很多解决方案,但它们都适用于Mongo v2并且不适合V3.
我的文档看起来像这样:
{
"_id" : ObjectId("582c98667d81e1d0270cb3e9"),
"asin" : "B01MTKPJT1",
"url" : "https://www.amazon.com/Trump-President-Presidential-Victory-T-Shirt/dp/B01MTKPJT1%3FSubscriptionId%3DAKIAIVCW62S7NTZ2U2AQ%26tag%3Dselfbalancingscooters-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB01MTKPJT1",
"image" : "http://ecx.images-amazon.com/images/I/41RvN8ud6UL.jpg",
"salesRank" : NumberInt(442137),
"title" : "Trump Wins 45th President Presidential Victory T-Shirt",
"brand" : "\"Getting Political On Me\"",
"favourite" : false,
"createdAt" : ISODate("2016-11-16T17:33:26.763+0000"),
"updatedAt" : ISODate("2016-11-16T17:33:26.763+0000")
}
Run Code Online (Sandbox Code Playgroud)
我的收藏包含大约500k文件.我想删除ASIN相同的所有重复文档(1除外)
我怎样才能做到这一点?
我在MongoDB上有一个非常大的集合,我想从该集合中删除重复的记录.我想到的第一个想法是删除索引并使用dropDups重建索引.但是,重复的数据太多,MongoDB无法处理.
所以我转向MapReduce寻求帮助.这是我目前的进展.
m = function () {
emit(this.myid, 1);
}
r = function (k, vals) {
return Array.sum(vals);
}
res = db.userList.mapReduce(m,r, { out : "myoutput" });
Run Code Online (Sandbox Code Playgroud)
并且所有重复记录的"myid"都存储在"myoutput"集合中.但是,我不知道如何通过引用myoutput.myid从userList中删除记录.它假设是这样的:
db.myoutput.find({value: {$gt: 1}}).forEach(
function(obj) {
db.userList.remove(xxxxxxxxx) // I don't know how to do so
})
Run Code Online (Sandbox Code Playgroud)
顺便说一句,使用foreach似乎会用理智的myid擦除所有记录.但我只是想删除重复的记录.例如:
{ "_id" : ObjectId("4edc6773e206a55d1c0000d8"), "myid" : 0 }
{ "_id" : ObjectId("4edc6780e206a55e6100011a"), "myid" : 0 }
{ "_id" : ObjectId("4edc6784e206a55ed30000c1"), "myid" : 0 }
Run Code Online (Sandbox Code Playgroud)
最终结果应该只保留一条记录.有人可以给我一些帮助吗?
谢谢.:)