Як би я знайшов повторювані поля в колекції mongo.
Я хотів би перевірити, чи будь-яке з полів "ім'я" є дублікатами.
{
"name" : "ksqn291",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1054ffa7086"),
"channel" : "Sales"
}
Велике дякую!
Як би я знайшов повторювані поля в колекції mongo.
Я хотів би перевірити, чи будь-яке з полів "ім'я" є дублікатами.
{
"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 " на " $ 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" ] }
Відповідь, яку дав анхік, може бути дуже неефективною, якщо у вас є велика база даних, а ім'я атрибута присутнє лише в деяких документах.
Щоб підвищити ефективність, ви можете додати $ агресію до агрегації.
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}
}
}
])
Перша група Запитайте групу відповідно до полів.
Потім ми перевіряємо унікальний ідентифікатор і підраховуємо його. Якщо кількість більший за 1, то поле дублюється у всій колекції, щоб ця річ була оброблена за допомогою $ match query.