gpt4 book ai didi

MongoDB 使用 ensureIndex 删除重复项但保留最后一个条目而不是第一个

转载 作者:可可西里 更新时间:2023-11-01 10:29:38 26 4
gpt4 key购买 nike

我有一个重复的问题。

我正在尝试从 MongoDB 集合中删除所有重复项,问题是我不想保留第一个条目,而是保留最后一个条目。

这是我保留第一个条目的方式:

db.CUDB.ensureIndex( { CUid: 1 }, { unique: true, dropDups: true } )

但我希望能够以相反的方式 insureIndex 并保留最后添加的条目而不是第一个。

最简单的方法是什么?

最佳答案

ensureIndex不提供执行此操作的方法。它也没有说明哪些值将被删除。

在您的情况下,我会尝试执行以下操作(这肯定比确保索引慢)。我还假设您有一些字段(在我的例子中是 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 次额外的数据库调用。

反向排序将确保最新的元素将被保存。

附言

Beware of bugs in the above code; I have only proved it correct, not tried it.

然后告诉我进展如何。

P.P.S. 如果您仍然无法在 mongo 中对所有集合进行排序,我会尝试在应用层进行排序。基本上你会找到你所有的收藏,用你想要的任何语言对它们进行排序,然后在那里也执行相同的逻辑。

关于MongoDB 使用 ensureIndex 删除重复项但保留最后一个条目而不是第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28582275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com