我如何在mongo集合中找到重复的字段。
我想检查是否有任何“name”字段是重复的。
{
"name" : "ksqn291",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1054ffa7086"),
"channel" : "Sales"
}
很多谢谢!
我如何在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.collection.aggregate([
{"$group" : { "_id": "$name", "count": { "$sum": 1 },"data": { "$push": "$$ROOT" }}},
{"$unwind": "$data"},
{"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } },
]);
如果您有一个大型数据库,并且属性名只出现在一些文档中,anhic给出的答案可能非常低效。
为了提高效率,您可以向聚合添加$匹配。
db.collection.aggregate(
{"$match": {"name" :{ "$ne" : null } } },
{"$group" : {"_id": "$name", "count": { "$sum": 1 } } },
{"$match": {"count" : {"$gt": 1} } },
{"$project": {"name" : "$_id", "_id" : 0} }
)
另一种选择是使用$sortByCount阶段。
db.collection.aggregate([
{ $sortByCount: '$name' }
]
这是$group & $sort的组合。
$sortByCount阶段相当于以下$group + $sort序列: {$组:{_id: <表达式>,数:{$金额:1}}}, {$sort: {count: -1}}
如果有人在寻找带有额外的"$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" ] }