2014-11-18 11 views
55

Jak znaleźć zduplikowane pola w kolekcji Mongo.Znajdź zduplikowane rekordy w MongoDB

Chciałbym sprawdzić, czy którekolwiek z pól "nazwa" są duplikaty.

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

Wielkie dzięki!

Odpowiedz

14

można znaleźć list z duplicate nazwy stosując następujący aggregate rurociągu:

  • Group wszystkie rekordy posiadające podobną name.
  • Match te groups o rekordach większych niż 1.
  • Następnie group ponownie do project wszystkie zduplikowane nazwy jako array.

Kod:

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" ] } 
95

Wykorzystanie agregacji na name i dostać name z count > 1:

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

Aby posortować wyniki według najbardziej najmniej duplikować ES:

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

używać z inną nazwą kolumny niż "nazwa", zmiana "$ name" na "$ COLUMN_NAME"

+1

'" $ match ": {" _id ": {" $ ne ": null}' - jest tutaj niepotrzebne, ponieważ wystarczy druga część instrukcji, by filtrować wynik. Tak więc zrobi to tylko sprawdzenie, czy grupa ma 'count> 1'. – BatScream

+3

Tks @BatScream. {"$ ne": null} jest na wszelki wypadek "nazwa" ma wartość null lub nie istnieje. Agregacja również będzie liczyła się null. – anhlc

+1

Witamy. Ale po co sprawdzać pole '_id'. Po operacji 'group' zawsze jest gwarantowane, że nie ma ona wartości null. – BatScream

-1
db.collectionName.aggregate([ 
{ $group:{ 
    _id:{Name:"$name"}, 
    uniqueId:{$addToSet:"$_id"}, 
    count:{"$sum":1} 
    } 
}, 
{ $match:{ 
    duplicate:{"$gt":1} 
} 
} 
]); 

pierwszego zapytania Grupa grupa zgodnie z pól .

Następnie sprawdzamy unikatowy identyfikator i policzymy go, jeśli liczba jest większa niż 1, to pole jest duplikowane w całej kolekcji, więc rzecz ma być obsługiwana przez zapytanie o dopasowanie.

+0

nie udało mi się sprawić, aby ten działał dla mnie – cpres

+0

nie był w stanie sprawić, by ten działał również dla mnie. Głosowanie w dół! –

2

Odpowiedź udzielona anhic może być bardzo nieskuteczna, jeśli masz dużą bazę danych, a nazwa atrybutu jest obecna tylko w niektórych dokumentach.

Aby zwiększyć wydajność, możesz dodać do agregacji dopasowanie $.

db.collection.aggregate(
    {"$match": {"name" :{ "$ne" : null } } }, 
    {"$group" : {"_id": "$name", "count": { "$sum": 1 } } }, 
    {"$match": {"count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} } 
) 
Powiązane problemy