2016-03-08 23 views
5

prima di tutto sono nuovo a mongo quindi non ne so molto e non posso semplicemente rimuovere le righe duplicate a causa di alcune dipendenze.Query distinto Mongo con oggetto riga intera

Ho dati seguente stored in Mongo

{'id': 1, 'key': 'qscderftgbvqscderftgbvqscderftgbvqscderftgbvqscderftgbv', 'name': 'some name', 'country': 'US'}, 
{'id': 2, 'key': 'qscderftgbvqscderftgbvqscderftgbvqscderftgbvqscderftgbv', 'name': 'some name', 'country': 'US'}, 
{'id': 3, 'key': 'pehnvosjijipehnvosjijipehnvosjijipehnvosjijipehnvosjiji', 'name': 'some name', 'country': 'IN'}, 
{'id': 4, 'key': 'pfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnew', 'name': 'some name', 'country': 'IN'}, 
{'id': 5, 'key': 'pfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnew', 'name': 'some name', 'country': 'IN'} 

potete vedere alcune delle righe sono duplicati con diversi id fintanto che ci vorrà per risolvere questo problema da input devo affrontarlo in uscita.

ho bisogno i dati nel seguente modo:

{'id': 1, 'key': 'qscderftgbvqscderftgbvqscderftgbvqscderftgbvqscderftgbv', 'name': 'some name', 'country': 'US'}, 
{'id': 3, 'key': 'pehnvosjijipehnvosjijipehnvosjijipehnvosjijipehnvosjiji', 'name': 'some name', 'country': 'IN'}, 
{'id': 4, 'key': 'pfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnewpfvvjwovnew', 'name': 'some name', 'country': 'IN'} 

La mia domanda

keys = db.collection.distinct('key', {}) 
all_data = db.collection.find({'key': {$in: keys}}) 

Come si può vedere ci vogliono due query per uno stesso set di risultati prega si combinano a uno come il database è molto grande

Potrei anche creare un unique key su key ma il valore è così lungo (152 caratteri) che non mi aiuterà.

Oppure lo farà ??

+0

Eventuali duplicati di [Rimuovi duplicati da MongoDB] (http://stackoverflow.com/questions/ 31557053/remove-duplicates-from-mongodb) –

+0

Forse non "esattamente" nella parte "rimozione", ma certamente nella parte di identificazione. Fondamentalmente è necessario '$ gruppo' sui campi comuni e quindi restituire qualsiasi altro campo ancillare con' $ first' –

risposta

5

È necessario utilizzare il framework di aggregazione per questo. Ci sono diversi modi per fare questo, la soluzione qui di seguito utilizza la variabile $$ROOT per ottenere il primo documento per ogni gruppo:

db.data.aggregate([{ 
    "$sort": { 
    "_id": 1 
    } 
}, { 
    "$group": { 
    "_id": "$key", 
    "first": { 
     "$first": "$$ROOT" 
    } 
    } 
}, { 
    "$project": { 
    "_id": 0, 
    "id":"$first.id", 
    "key":"$first.key", 
    "name":"$first.name", 
    "country":"$first.country" 
    } 
}])