ho un database con diverse collezioni (complessivi ~ documenti 15mil) e documenti simile a questa (semplificato):pymongo: rimuovere i duplicati (mappa a ridurre?)
{'Text': 'blabla', 'ID': 101}
{'Text': 'Whuppppyyy', 'ID': 102}
{'Text': 'Abrakadabraaa', 'ID': 103}
{'Text': 'olalalaal', 'ID': 104}
{'Text': 'test1234545', 'ID': 104}
{'Text': 'whapwhapwhap', 'ID': 104}
Tutti hanno un campo _id unico come bene, ma voglio eliminare i duplicati in un altro campo (il campo ID esterno).
In primo luogo, ho provato un approccio molto manuale con elenchi e la cancellazione in seguito, ma il DB sembra troppo grande, richiede molto tempo e non è pratico.
In secondo luogo, quanto segue non funziona più nelle attuali versioni di MongoDB, anche se qualcuno lo suggerisce.
db.collection.ensureIndex({ ID: 1 }, { unique: true, dropDups: true })
Così, ora sto cercando di creare una mappa a ridurre soluzione, ma io non so davvero cosa fare Im e soprattutto hanno difficoltà ad usare un altro campo (non il _id database) per trovare ed eliminare i duplicati. Ecco il mio cattivo approccio prima (adottato da qualche fonte 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}})
Qualsiasi contribuire a ridurre i duplicati nel campo ID esterno (lasciando una voce), sarebbe molto apprechiated;) Grazie!
MongoDB 2.6 sta dicendo mi DeprecationWarning: rimuovere è deprecato. Utilizza invece delete_one o delete_many. – wordsforthewise