2014-11-18 35 views
55

Come trovo i campi duplicati in una raccolta di mongo.Trova record duplicati in MongoDB

mi piacerebbe verificare se uno dei campi "nome" sono duplicati.

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

Grazie mille!

risposta

14

È possibile trovare i list di duplicate nomi utilizzando il seguente aggregate gasdotto:

  • Group tutti i record avendo simili name.
  • Match coloro che hanno groups record superiori a 1.
  • Poi group ancora a project tutti i nomi duplicati come un array.

Il Codice:

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

Usa aggregazione su name e ottenere name con count > 1:

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

per ordinare i risultati di più almeno duplicato 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} }  
) 

da utilizzare con un altro nome di colonna di "nome", cambiare "$ nome" a "$ nome_colonna"

+1

'" $ match ": {" _id ": {" $ ne ": null}' - non è necessario qui, poiché la seconda parte dell'istruzione sarebbe sufficiente a filtrare il risultato. Quindi, solo il controllo del gruppo che ha "contare> 1" andrà bene. – BatScream

+3

Tks @BatScream. {"$ ne": null} esiste solo nel caso in cui 'name' sia null o non esista. Anche l'aggregazione conta nullo. – anhlc

+1

Benvenuto. Ma allora perché controllare il campo '_id'. È sempre garantito che non sia nulla dopo l'operazione 'group'. – BatScream

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

Primo gruppo di query del gruppo in base ai campi .

quindi controlliamo l'ID univoco e ritengo che, se count è maggiore di 1, quindi il campo è duplicato in tutta la collezione in modo che cosa è essere maniglia da $ query partita.

+0

non è riuscito a far funzionare questo per me – cpres

+0

non sono riuscito a farlo funzionare anche per me. Giù votando! –

2

La risposta anhic dato può essere molto inefficiente se si dispone di un database di grandi dimensioni e il nome di attributo è presente solo in alcuni dei documenti.

per migliorare l'efficienza è possibile aggiungere un $ partita per l'aggregazione.

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