【问题标题】:Mongo find duplicates for entries for two or more fieldsMongo 为两个或多个字段的条目查找重复项
【发布时间】:2016-06-08 01:31:56
【问题描述】:

我有这样的文件:

{
    "_id" : ObjectId("557eaf444ba222d545c3dffc"),
    "foreing" : ObjectId("538726124ba2222c0c0248ae"),
    "value" : "test",
}

我想查找对 foreingvalue 具有重复值的所有文档。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    我们只需要根据 2 个 key 进行分组,然后选择 count 大于 1 的元素即可找到重复项。

    查询 :- 会像

    db.mycollection.aggregate(
        { $group: { 
            _id: { foreing: "$foreing", value: "$value" },
            count: { $sum:  1 },
            docs: { $push: "$_id" }
        }},
        { $match: {
            count: { $gt : 1 }
        }}
    )
    

    输出 :- 会像

    {
        "result" : [
            {
                "_id" : {
                    "foreing" : 1,
                    "value" : 2
                },
                "count" : 2,
                "docs" : [
                    ObjectId("34567887654345678987"),
                    ObjectId("34567887654345678987")
                ]
            }
        ],
        "ok" : 1
    }
    

    参考链接:-How to find mongo documents with a same field

    【讨论】:

      【解决方案2】:

      您可以通过运行以下聚合管道操作轻松识别重复项:

      db.collection.aggregate([
          { 
              "$group": { 
                  "_id": { "foreing": "$foreing", "value": "$value" }, 
                  "uniqueIds": { "$addToSet": "$_id" },
                  "count": { "$sum": 1 } 
              }
          }, 
          { "$match": { "count": { "$gt": 1 } } }
      ])
      

      第一步中的$group运算符用于按foreignvalue键值对文档进行分组,然后为每个_id值创建一个数组使用 $addToSet 运算符将文档分组为 uniqueIds 字段。这为您提供了每个组的唯一表达式值数组。使用 $sum 运算符获取要在后续管道阶段使用的分组文档总数。

      在第二个管道阶段,使用 $match 运算符过滤掉所有计数为 1 的文档。过滤掉的文档代表唯一的索引键。

      剩余的文档将是集合中具有重复键值对 foreingvalue 的文档。

      【讨论】:

      • 请问有没有办法直接返回ID?我的意思是,uniqueIds 数组的内容。
      • 真的很神奇,一开始我遇到了磁盘错误,所以我传递了第二个参数来允许磁盘... ,{allowDiskUse:true}
      【解决方案3】:

      node.js require 和 ES6 导入导出的区别

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        • 1970-01-01
        • 2016-12-28
        • 2012-05-15
        • 2011-08-08
        • 1970-01-01
        相关资源
        最近更新 更多