In the documentation for mongoDB it says: "Changed in version 3.0: The dropDups option is no longer available."
Is there anything I can do (other than downgrading) if I actually want to create a unique index and destroy duplicate entries?
please keep in mind the I receive about 300 inserts per second so I can't just delete all duplicates and hope none will come in by the time I'm done indexing.
Yes dropDupes
is now deprecated since version 2.7.5 because it was not possible to predict correctly which document would be deleted in the process.
Typically, you have 2 options :
Use a new collection :
Deal with it in your own collection manually :
For your particular case, I would recommend the first option but with a trick :
As highlighted by @Maxime-Beugnet you can create a batch script to remove duplicates from a collection. I have included my approach below that is relatively fast if the number of duplicates are small in comparison to the collection size. For demonstration purposes this script will de-duplicate the collection created by the following 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; }
You can remove the duplicates in this collection by writing an aggregate query that returns all records with more than one duplicate.
var cur = db.numbers.aggregate([{ $group: { _id: { value: "$value" }, uniqueIds: { $addToSet: "$_id" }, count: { $sum: 1 } } }, { $match: { count: { $gt: 1 } } }]);
Using the cursor you can then iterate over the duplicate records and implement your own business logic to decide which of the duplicates to remove. In the example below I am simply keeping the first occurrence:
while (cur.hasNext()) { var doc = cur.next(); var index = 1; while (index < doc.uniqueIds.length) { db.numbers.remove(doc.uniqueIds[index]); index = index + 1; } }
After removal of the duplicates you can add an unique index:
db.numbers.createIndex( {"value":1},{unique:true})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With