Mam bazę danych z kilku kolekcji (całkowita ~ dokumentów 15mil) oraz dokumentów wyglądać (uproszczony):pymongo: usunąć duplikaty (mapa zmniejszyć?)
{'Text': 'blabla', 'ID': 101}
{'Text': 'Whuppppyyy', 'ID': 102}
{'Text': 'Abrakadabraaa', 'ID': 103}
{'Text': 'olalalaal', 'ID': 104}
{'Text': 'test1234545', 'ID': 104}
{'Text': 'whapwhapwhap', 'ID': 104}
Wszyscy mają unikalną pola _id jako dobrze, ale chcę usunąć duplikaty accodring do innego pola (zewnętrznego pola ID).
Po pierwsze, próbowałem bardzo ręcznego podejścia z listami i usuwaniem później, ale DB wydaje się zbyt duży, zajmuje bardzo dużo czasu i nie jest praktyczny.
Po drugie, poniższe wersje nie działają w aktualnych wersjach MongoDB, nawet jeśli ktoś je sugeruje.
db.collection.ensureIndex({ ID: 1 }, { unique: true, dropDups: true })
Więc teraz staram się stworzyć mapę zmniejszyć rozwiązanie, ale ja naprawdę nie wiem, co robię, a zwłaszcza mają trudności z wykorzystaniem innego pola (nie _id baza danych), aby znaleźć i usunąć duplikaty. Oto mój pierwszy złe podejście (przyjęta z jakiegoś źródła interent):
map = Code("function(){ if(this.fieldName){emit(this.fieldName,1);}}")
reduce = Code("function(key,values) {return Array.sum(values);}")
res = coll.map_reduce(map,reduce,"my_results");
response = []
for doc in res.find():
if(doc['value'] > 1):
count = int(doc['value']) - 1
docs = col.find({"fieldName":doc['ID']},{'ID':1}).limit(count)
for i in docs:
response.append(i['ID'])
coll.remove({"ID": {"$in": response}})
Każda pomoc, aby zmniejszyć wszelkie duplikaty w polu ID zewnętrznej (pozostawiając jednego wpisu), byłyby bardzo apprechiated;) Dzięki!
MongoDB 2.6 mówi mi DeprecationWarning: usunięcie jest przestarzała. Zamiast tego użyj delete_one lub delete_many. – wordsforthewise