我正在使用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)
我没有使用过mongoDB,但我使用过mapreduce。我认为您在 MapReduce 功能方面走在正确的轨道上。要排除 0 和空字符串,您可以在映射函数本身中添加一个检查..类似
m = function () {
if(this.MlsId!=0 && this.MlsId!="") {
emit(this.MlsId, 1);
}
}
Run Code Online (Sandbox Code Playgroud)
而reduce应该返回键值对。所以应该是:
r = function(k, vals) {
emit(k,Arrays.sum(vals);
}
Run Code Online (Sandbox Code Playgroud)
此后,输出中应该有一组键值对,其中键是 MlsId,值是此特定 ID 出现的次数。我不确定 db.drop() 部分。正如您所指出的,它很可能会删除所有 MlsId,而不是仅删除重复的 MlsId。为了解决这个问题,也许您可以先调用 drop(),然后重新创建 MlsId 一次。这对你有用吗?
| 归档时间: |
|
| 查看次数: |
17997 次 |
| 最近记录: |