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

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

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

很多谢谢!


当前回答

如果有人在寻找带有额外的"$and" where子句的重复查询,比如"and where someOtherField is true"

诀窍是从另一个$match开始,因为分组之后就不再有所有可用的数据了

// Do a first match before the grouping
{ $match: { "someOtherField": true }},
{ $group: {
    _id: { name: "$name" },
    count: { $sum: 1 }
}},
{ $match: { count: { $gte: 2 } }},

我找了很长时间才找到这个符号,希望我能帮助有同样问题的人

其他回答

您可以使用以下聚合管道找到重复名称的列表:

将所有名称相似的记录分组。 匹配那些记录大于1的组。 然后再次分组,将所有重复的名称投影为一个数组。

代码:

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}}
])

o/p:

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

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

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

例如,当您想创建一个不区分大小写的索引时,有时您希望无论大小写都能找到重复项。在这种情况下,您可以使用这个聚合管道

db.collection.aggregate([
  {'$group': {'_id': {'$toLower': '$name'}, 'count': { '$sum': 1 }, 'duplicates': { '$push': '$$ROOT' } } },
  {'$match': { 'count': { '$gt': 1 } } 
]);

解释:

按名称分组,但首先将大小写改为小写,并将docs推到duplicate数组中。 匹配那些记录大于1的组(重复项)。

在Compass Mongo数据库中使用$sortByCount搜索重复 (截图):https://i.stack.imgur.com/L85QV.png

如果有人在寻找带有额外的"$and" where子句的重复查询,比如"and where someOtherField is true"

诀窍是从另一个$match开始,因为分组之后就不再有所有可用的数据了

// Do a first match before the grouping
{ $match: { "someOtherField": true }},
{ $group: {
    _id: { name: "$name" },
    count: { $sum: 1 }
}},
{ $match: { count: { $gte: 2 } }},

我找了很长时间才找到这个符号,希望我能帮助有同样问题的人