在MongoDB中查找重复记录

Chr*_*ris 87 database mongodb aggregation-framework

我如何在mongo集合中找到重复的字段.

我想检查是否有任何"名称"字段是重复的.

{
    "name" : "ksqn291",
    "__v" : 0,
    "_id" : ObjectId("540f346c3e7fc1054ffa7086"),
    "channel" : "Sales"
}
Run Code Online (Sandbox Code Playgroud)

非常感谢!

anh*_*hlc 167

在使用聚合name,并得到namecount > 1:

db.collection.aggregate(
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} }
)
Run Code Online (Sandbox Code Playgroud)

要按大多数重复排序结果:

db.collection.aggregate(
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$sort": {"count" : -1} },
    {"$project": {"name" : "$_id", "_id" : 0} }     
)
Run Code Online (Sandbox Code Playgroud)

要与"name"之外的其他列名一起使用,请将 " $ name " 更改为" $ column_name "

  • Tks @BatScream.{"$ ne":null}只是在'name'为null或不存在的情况下.聚合也将计为null. (4认同)
  • 来自`$ group`阶段的文档的`_id`可以为null. (4认同)
  • `"$match": {"_id" :{ "$ne" : null } `- 在这里是不必要的,因为语句的第二部分足以过滤结果。因此,只需检查“count > 1”的组即可。 (2认同)

Bat*_*eam 21

你可以找到listduplicate使用下列名称aggregate管道:

  • Group所有记录都有相似之处name.
  • Match那些groups记录大于1.
  • 然后group再将project所有重复的名称作为array.

代码:

db.collection.aggregate([
{$group:{"_id":"$name","name":{$first:"$name"},"count":{$sum:1}}},
{$match:{"count":{$gt:1}}},
{$project:{"name":1,"_id":0}},
{$group:{"_id":null,"duplicateNames":{$push:"$name"}}},
{$project:{"_id":0,"duplicateNames":1}}
])
Run Code Online (Sandbox Code Playgroud)

O/P:

{ "duplicateNames" : [ "ksqn291", "ksqn29123213Test" ] }
Run Code Online (Sandbox Code Playgroud)

  • 事实上,您解释了每一行的作用,使得这个答案变得最佳。 (2认同)

Tan*_*Dat 21

另一种选择是使用$sortByCount舞台。

db.collection.aggregate([
  { $sortByCount: '$name' }
]
Run Code Online (Sandbox Code Playgroud)

$group这是&的组合$sort

$sortByCount阶段相当于以下$group+$sort序列:

    { $group: { _id: <expression>, count: { $sum: 1 } } },
    { $sort: { count: -1 } }
Run Code Online (Sandbox Code Playgroud)


小智 9

db.getCollection('orders').aggregate([  
    {$group: { 
            _id: {name: "$name"},
            uniqueIds: {$addToSet: "$_id"},
            count: {$sum: 1}
        } 
    },
    {$match: { 
        count: {"$gt": 1}
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

第一组 根据字段查询组。

然后我们检查唯一的 Id 并对其进行计数,如果计数大于 1,则该字段在整个集合中是重复的,以便由 $match 查询处理。


小智 8

如果您的数据库很大,并且属性名称仅出现在某些文档中,那么anhic给出的答案可能会非常无效。

为了提高效率,您可以在聚合中添加$ match。

db.collection.aggregate(
    {"$match": {"name" :{ "$ne" : null } } }, 
    {"$group" : {"_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} }
)
Run Code Online (Sandbox Code Playgroud)


Tan*_*eel 5

在此输入图像描述

这就是我们如何在 mongoDB compass 中实现这一目标