Wie hervorgehoben durch @ Maxime-Beugnet schreiben können Sie eine Batch-Skript erstellen Duplikate aus einer Sammlung zu entfernen. Ich habe unten meinen Ansatz aufgenommen, der relativ schnell ist, wenn die Anzahl der Duplikate im Vergleich zur Sammlungsgröße klein ist.Zu Demonstrationszwecken wird dieses Skript Deduplizierung die Sammlung durch das folgende Skript erstellt:
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;
}
Sie können die Duplikate in dieser Sammlung entfernen, indem ein Aggregat Abfrage zu schreiben, die alle Datensätze mit mehr als einem Duplikat zurückgibt.
var cur = db.numbers.aggregate([{ $group: { _id: { value: "$value" }, uniqueIds: { $addToSet: "$_id" }, count: { $sum: 1 } } }, { $match: { count: { $gt: 1 } } }]);
Mit dem Cursor können Sie dann über die doppelte Datensätze durchlaufen und Ihre eigene Business-Logik implementieren, welche der Duplikate zu entscheiden, zu entfernen. Im Beispiel unten Ich bin einfach halte das erste Vorkommen:
while (cur.hasNext()) {
var doc = cur.next();
var index = 1;
while (index < doc.uniqueIds.length) {
db.numbers.remove(doc.uniqueIds[index]);
index = index + 1;
}
}
Nach dem Entfernen der Duplikate können Sie einen eindeutigen Index hinzu:
db.numbers.createIndex({"value":1},{unique:true})
Ich verstehe Ihre Frage nicht. Ist es richtig, dass Sie bereits vorhandene Dokumente haben, einschließlich Duplikate, und jetzt möchten Sie einen eindeutigen Index auf das Feld legen, der Duplikate kontaktiert, während gleichzeitig neue potenzielle Betrogene kommen? –
ja. Ich möchte die Dups loswerden und wenn neue kommen, lehne sie ab. – Alonzorz
Ich bin mit diesem Problem auch geblieben, gibt es eine Alternative, wie man Dubletten ohne 'dropDups' in MongoDB> = 3 loswerden kann. –