在mongoDB的文档中写着:
"自3.0版本起,dropDups选项不再可用。"
如果我想要创建唯一索引并删除重复条目,除了降级之外,还有其他能做的吗?
请注意,我每秒会收到约300个插入请求,所以我不能只是删除所有重复项并希望在完成索引之前没有新的重复项出现。
是的,dropDupes
现在已经被弃用,因为无法正确预测哪个文档将被删除。
通常情况下,您有两个选择:
使用新集合:
手动处理您自己的集合:
对于您的特定情况,我建议使用第一种选项,但有一个技巧:
正如@Maxime-Beugnet所强调的那样,您可以创建一个批处理脚本来从集合中删除重复项。我在下面提供了我的方法,如果重复项的数量相对于集合大小较小,则可以实现相对较快的速度。为了演示目的,此脚本将去重以下脚本创建的集合:
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;
}
通过编写一个聚合查询,返回所有有超过一个重复记录的记录,您可以在此集合中删除重复项。
var cur = db.numbers.aggregate([{ $group: { _id: { value: "$value" }, uniqueIds: { $addToSet: "$_id" }, count: { $sum: 1 } } }, { $match: { count: { $gt: 1 } } }]);
使用游标,您可以迭代重复记录并实现自己的业务逻辑来决定要删除哪些重复项。在下面的示例中,我只保留第一次出现:
while (cur.hasNext()) {
var doc = cur.next();
var index = 1;
while (index < doc.uniqueIds.length) {
db.numbers.remove(doc.uniqueIds[index]);
index = index + 1;
}
}
去重之后,您可以添加唯一索引:
db.numbers.createIndex( {"value":1},{unique:true})
pip install mongo_remove_duplicate_indexes
最好的方法是创建一个Python脚本,或使用您喜欢的任何语言,迭代集合,创建一个唯一索引为true的新集合,使用db.collectionname.createIndex({'indexname':1},unique:true),并将先前集合中的文档插入到新集合中。由于您希望不同或重复的键不会插入新集合中,因此可以轻松处理异常。
请查看示例的软件包源代码。
dropDups
? - dr.dimitru