使用MapReduce删除重复记录

Jus*_*tin 7 mapreduce mongodb

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

Har*_*non 2

我没有使用过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 一次。这对你有用吗?