Как найти повторяющиеся поля в коллекции mongo.
Я хочу проверить, не дублируются ли какие-либо поля "name".
{
"name" : "ksqn291",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1054ffa7086"),
"channel" : "Sales"
}
Большое спасибо!
Как найти повторяющиеся поля в коллекции mongo.
Я хочу проверить, не дублируются ли какие-либо поля "name".
{
"name" : "ksqn291",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1054ffa7086"),
"channel" : "Sales"
}
Большое спасибо!
Ответы:
Используйте агрегацию на name
и получить name
с count > 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 "
"$match": {"_id" :{ "$ne" : null }
- здесь не требуется, так как второй части оператора было бы достаточно для фильтрации результата. Так что достаточно проверить наличие группы count > 1
.
_id
поле. После group
операции всегда гарантируется, что он не будет нулевым .
_id
Документа от $group
стадии может быть пустым.
Вы можете найти list
из duplicate
имен с помощью следующего 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}}
])
о / п:
{ "duplicateNames" : [ "ksqn291", "ksqn29123213Test" ] }
Ответ, данный anhic, может быть очень неэффективным, если у вас большая база данных, а имя атрибута присутствует только в некоторых документах.
Для повышения эффективности вы можете добавить в агрегирование $ match.
db.collection.aggregate(
{"$match": {"name" :{ "$ne" : null } } },
{"$group" : {"_id": "$name", "count": { "$sum": 1 } } },
{"$match": {"count" : {"$gt": 1} } },
{"$project": {"name" : "$_id", "_id" : 0} }
)
db.getCollection('orders').aggregate([
{$group: {
_id: {name: "$name"},
uniqueIds: {$addToSet: "$_id"},
count: {$sum: 1}
}
},
{$match: {
count: {"$gt": 1}
}
}
])
Первая группа. Запросите группу в соответствии с полями.
Затем мы проверяем уникальный идентификатор и подсчитываем его. Если count больше 1, то поле дублируется во всей коллекции, так что это должно обрабатываться запросом $ match.