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

我想检查是否有任何“name”字段是重复的。

{
    "name" : "ksqn291",
    "__v" : 0,
    "_id" : ObjectId("540f346c3e7fc1054ffa7086"),
    "channel" : "Sales"
}

很多谢谢!


当前回答

如果你需要查看所有复制的行:

db.collection.aggregate([
     {"$group" : { "_id": "$name", "count": { "$sum": 1 },"data": { "$push": "$$ROOT" }}},
     {"$unwind": "$data"},
     {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
]);

其他回答

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

第一组根据字段查询分组。

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

另一种选择是使用$sortByCount阶段。

db.collection.aggregate([
  { $sortByCount: '$name' }
]

这是$group & $sort的组合。

$sortByCount阶段相当于以下$group + $sort序列: {$组:{_id: <表达式>,数:{$金额:1}}}, {$sort: {count: -1}}

在名称上使用聚合,并使用计数>获取名称1:

db.collection.aggregate([
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} }
]);

按重复数从多到少对结果进行排序:

db.collection.aggregate([
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$sort": {"count" : -1} },
    {"$project": {"name" : "$_id", "_id" : 0} }     
]);

要使用除“name”以外的其他列名,请将“$name”更改为“$column_name”

如果你需要查看所有复制的行:

db.collection.aggregate([
     {"$group" : { "_id": "$name", "count": { "$sum": 1 },"data": { "$push": "$$ROOT" }}},
     {"$unwind": "$data"},
     {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
]);

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