【问题标题】:How to comapre all records of two collections in mongodb using mapreduce?如何使用mapreduce比较mongodb中两个集合的所有记录?
【发布时间】:2014-05-12 07:46:15
【问题描述】:

我有一个用例,我想比较 mongodb 中两个集合的每条记录,比较每条记录后,我需要找到所有记录的不匹配字段。

让我们举个例子,在 collection1 我有一条记录为 {id : 1, name : "bks"} 在 collection2 我有一条记录为 {id : 1, name : "abc"} 当我用相同的键比较上述两条记录时,字段名称是一个不匹配的字段,因为名称不同。

我正在考虑在 mongodb 中使用 mapreduce 来实现这个用例。但是我在地图功能中访问集合名称时遇到了一些问题。当我尝试在 map 函数中比较它时,出现错误:"errmsg":"exception: ReferenceError: db is not defined near '

谁能给我一些关于如何使用 mapreduce 比较记录的想法?

【问题讨论】:

    标签: mongodb mapreduce


    【解决方案1】:

    我可能已经帮你read the documentation:

    升级到 MongoDB 2.4 时,如果您的 map-reduce 操作、组命令或 $where 运算符表达式包含任何不再可用的全局 shell 函数或属性,例如 db,您将需要重构代码

    因此,从您的错误片段来看,您似乎在引用 db 以访问另一个集合。你不能那样做。

    如果您确实打算将一个集合中的项目与另一个集合中的项目“比较”,那么除了循环代码之外没有其他方法:

    db.collection.find().forEach(function(doc) {
    
        var another = db.anothercollection.findOne({ "_id": doc._id });
    
        // Code to compare
    
    })
    

    MongoDB 根本没有“连接”的概念,mapReduceaggregate 或其他操作仅适用于 one 集合。

    例外是db.eval(),但根据文档中的所有严格警告,这几乎总是一个非常糟糕的主意。

    接受循环代码中的比较。

    【讨论】:

    • @Nell:感谢您的回复。但是我在两个集合中都有 20-30 百万条记录,那么需要更多时间吗?
    • @bks。但是什么?但是你期待有人说“这就是你的做法?”。根据文档链接,您不能使用 mapReduce 执行此操作。有db.eval(),但它不是一个很好的选择,除非你这样做。如果您的集合被分片,则显然不适用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2013-08-28
    • 2018-09-01
    • 1970-01-01
    相关资源
    最近更新 更多