2016-03-08 10 views
5

Przede wszystkim jestem nowy w mongo, więc nie wiem zbyt wiele i nie mogę po prostu usunąć zduplikowanych wierszy z powodu pewnych zależności.Mongo Distinct Query z pełnym wierszem obiektu

Mam następujące dane przechowywane w 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'} 

można zobaczyć niektóre z wierszy są duplikaty z innym identyfikatorem tak długo, jak długo potrwa, aby rozwiązać ten problem z wejściem muszę zająć się nim na wyjściu.

muszę dane w następujący sposób:

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

Moje zapytanie

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

Jak widać trwa dwa zapytania dla tego samego zbioru wyniku Proszę połączyć go do jednego jako baza danych jest bardzo duża

Mogę również utworzyć unique key na key, ale wartość jest tak długa (152 znaki), że mi to nie pomoże.

Albo będzie?

+0

Możliwy duplikat [Usuń duplikaty z MongoDB] (http://stackoverflow.com/questions/ 31557053/remove-duplicates-from-mongodb) –

+0

Może nie "dokładnie" w części "usuwanie", ale z pewnością w części identyfikacyjnej. Zasadniczo musisz '$ group' na wspólnym polu (ach), a następnie zwrócić wszystkie inne pomocnicze pola z' $ first' –

Odpowiedz

5

Musisz użyć do tego struktury agregacji. Istnieje wiele sposobów, aby to zrobić, rozwiązanie poniżej używa zmiennej $$ROOT zdobyć pierwszy dokument dla każdej grupy:

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