come evidenziato dalla @ Maxime-Beugnet è possibile creare uno script batch per rimuovere i duplicati da una raccolta. Ho incluso il mio approccio qui sotto che è relativamente veloce se il numero di duplicati è piccolo rispetto alla dimensione della collezione.A scopo dimostrativo questo script de-duplicare la collezione creata da seguente script:
db.numbers.drop()
var counter = 0
while (counter<=100000){
db.numbers.save({"value":counter})
db.numbers.save({"value":counter})
if (counter % 2 ==0){
db.numbers.save({"value":counter})
}
counter = counter + 1;
}
È possibile rimuovere i duplicati di questa collezione scrivendo una query di aggregazione che restituisce tutti i record con più di un duplicato.
var cur = db.numbers.aggregate([{ $group: { _id: { value: "$value" }, uniqueIds: { $addToSet: "$_id" }, count: { $sum: 1 } } }, { $match: { count: { $gt: 1 } } }]);
Utilizzando il cursore è possibile scorrere i record duplicati e realizzare la propria logica di business per decidere quale dei duplicati per rimuovere. Nell'esempio che segue Sto semplicemente mantenendo la prima occorrenza:
while (cur.hasNext()) {
var doc = cur.next();
var index = 1;
while (index < doc.uniqueIds.length) {
db.numbers.remove(doc.uniqueIds[index]);
index = index + 1;
}
}
Dopo la rimozione dei duplicati è possibile aggiungere un indice univoco:
db.numbers.createIndex({"value":1},{unique:true})
Non capisco la tua domanda. Ho capito bene che hai documenti esistenti compresi i duplicati e ora vuoi mettere un indice unico sul campo contattando duplicati mentre allo stesso tempo entrano in gioco potenziali nuovi imbroglioni? –
si. Voglio sbarazzarmi dei fanatici e se ne arrivano di nuovi li respingo. – Alonzorz
Ho anche bloccato questo problema, c'è qualche alternativa su come eliminare i duplicati senza 'dropDups' in MongoDB> = 3. * ?? –