我正在使用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();

最佳答案

我没有使用MongoDB,但使用了MapReduce。我认为在mapreduce函数方面,您走的是正确的道路。要排除0和空字符串,可以在映射函数本身中添加签入。有点像

m = function () {
  if(this.MlsId!=0 && this.MlsId!="") {
    emit(this.MlsId, 1);
  }
}

reduce应该返回键值对。所以应该是:
r = function(k, vals) {
  emit(k,Arrays.sum(vals);
}

在这之后,您应该在输出中有一组键值对,这样键就是mlsid,值就是这个特定ID发生的时间段数。我不确定db.drop()部分。正如您所指出的,它很可能会删除所有MLSID,而不是只删除重复的MLSID。为了解决这个问题,您可以先调用drop(),然后重新创建一次mlsid。这对你有用吗?

09-11 02:00