我在mongodb中有大约170万份文件(将来10m +).其中一些代表我不想要的重复条目.文档的结构是这样的:
{
    _id: 14124412,
    nodes: [
        12345,
        54321
        ],
    name: "Some beauty"
}
如果文档至少有一个节点与具有相同名称的另一个文档相同,则文档是重复的.删除重复项的最快方法是什么?
我创建了一个集合并添加了一个这样的唯一键
db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true,dropDups: true})
该集合看起来像这样的"user_services"
{
 "_id" : ObjectId("55068b35f791c7f81000002d"),
 "uid" : 15,
 "sid" : 1,
 "rate" : 5
},
{
 "_id" : ObjectId("55068b35f791c7f81000002f"),
 "uid" : 15,
 "sid" : 1,
 "rate" : 4
}
问题:
我使用php驱动程序插入具有相同的uid和sid的文档,它正在插入.
我想要的是
我正在使用MongoDB,需要删除重复的记录.我有一个看起来像这样的列表集合:(简化)
[
  { "MlsId": "12345"" },
  { "MlsId": "12345" },
  { "MlsId": "23456" },
  { "MlsId": "23456" },
  { "MlsId": "0" },
  { "MlsId": "0" },
  { "MlsId": "" },
  { "MlsId": "" }
]
如果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();
我已经看到了很多解决方案,但它们都适用于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")
}
我的收藏包含大约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" });
并且所有重复记录的"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
})
顺便说一句,使用foreach似乎会用理智的myid擦除所有记录.但我只是想删除重复的记录.例如:
{ "_id" : ObjectId("4edc6773e206a55d1c0000d8"), "myid" : 0 }
{ "_id" : ObjectId("4edc6780e206a55e6100011a"), "myid" : 0 }
{ "_id" : ObjectId("4edc6784e206a55ed30000c1"), "myid" : 0 }
最终结果应该只保留一条记录.有人可以给我一些帮助吗?
谢谢.:)