我有一个重复的问题。
我正在尝试从MongoDB集合中删除所有重复项,问题是我不想保留第一个条目,而是最后一个条目。
这就是我保留第一个条目的方式:
db.CUDB.ensureIndex( { CUid: 1 }, { unique: true, dropDups: true } )
但是我希望能够以相反的方式确保索引并保持最后添加的条目而不是第一个。
最简单的方法是什么?
sureIndex没有提供执行此操作的方法。同样,它也没有告诉您将删除哪些值。
在您的情况下,我将尝试执行以下操作(这肯定会比确保索引慢一些)。我还created_at
基于您决定一个文档是否比另一个文档更旧的假设您有一个字段(在我的情况下):
var checked = {}; // basically a hash, which ensures O(1) lookup
db.coll.find().sort({created_at: -1}).forEach(function(o){
if (o['CUid'] in checked){
db.coll.remove({_id: o['_id']});
} else {
checked[o['CUid']] = 1;
}
})
因此,基本上,我们以相反的顺序迭代所有文档(最新的是第一个),并检查我们是否已经看到您的CUid
字段。如果没有,请将该文档保留为原样并将其标记为可见。如果以后再看到其他任何相同的文档CUid
,则可以将其删除。
最后,您将对集合进行完整扫描,N
并对每个重复的元素进行额外的数据库调用。
反向排序将确保将保存最新的元素。
聚苯乙烯
当心上面代码中的错误;我只是证明它是正确的,没有尝试过。
告诉我怎么回事。
PPS如果您仍然无法在mongo中对所有集合进行排序,我会尝试在应用程序层上进行。基本上,您会找到所有集合,使用所需的任何语言对它们进行排序,然后在其中执行相同的逻辑。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句