2016-03-08 6 views
5

Ich bin neu zu Mongo, so dass ich nicht viel weiß und ich kann nicht einfach doppelte Zeilen aufgrund einiger Abhängigkeiten entfernen.Mongo Distinct Abfrage mit voller Zeile Objekt

Ich habe folgende Daten in Mongo gespeichert

{'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'} 

Sie so lange einige Zeilen sind doppelt mit unterschiedlicher ID sehen können, wie sie dieses Problem zu lösen, nehmen vom Eingang ich es auf Ausgang angehen muß.

muss ich die Daten auf folgende Weise:

{'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'} 

Meine Anfrage

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

Wie Sie sehen, es dauert zwei Abfragen für eine gleiche Ergebnismenge kombinieren Sie es zu einem als Datenbank ist sehr groß

Ich könnte auch eine unique key auf der key erstellen, aber der Wert ist so lang (152 Zeichen), dass es mir nicht helfen wird.

Oder wird es ??

+0

Mögliches Duplikat [Duplikate entfernen von MongoDB] (http://stackoverflow.com/questions/ 31557053/remove-duplicates-from-mongodb) –

+0

Vielleicht nicht "genau" im "removal" Teil, aber sicherlich im identification Teil. Im Grunde müssen Sie in den allgemeinen Feldern "$ group" eingeben und dann alle anderen Hilfsfelder mit "$ first" zurückgeben –

Antwort

5

Sie müssen das Aggregation Framework dafür verwenden. Es gibt mehr Möglichkeiten, dies zu tun, unter der Lösung verwendet das $$ROOT Variable das erste Dokument für jede Gruppe zu erhalten:

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