mongodb - 使用 MapReduce 删除重复记录

标签 mongodb mapreduce

我正在使用 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 功能方面走在正确的轨道上。要排除 he 0 和空字符串,您可以在 map 函数本身中添加一个检查.. 类似于

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

关于mongodb - 使用 MapReduce 删除重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5530580/

相关文章:

java - setMapoutputkeyclass和setMapoutputvalueclass方法

hadoop - 执行 Hive 查询时分配了多少个 Mappers 和 Reducers

javascript - 同步for循环

Windows 上的 Python Hadoop 流,脚本不是有效的 Win32 应用程序

java - 如何在scala中编写hadoop map reduce程序

php - 我可以在 php 中将 mongodb 查询作为字符串传递吗

java - 如何从目录中选择特定的输入文件到Mapreduce程序

mongodb - 我们可以使用任何其他数据库,如 MariaDB 或 MongoDB 来在 Kafka Streams 中存储状态而不是 Rocks DB,有什么方法可以配置它吗?

mongodb - 有没有办法使用 "update"函数在给定查询和排序选项的情况下更新 MongoDB 集合中的第一个文档?

node.js - Mongoose :将元素插入或替换到数组中