Mongo删除和插入与更新的区别

6
我正在使用mongo 3.0数据库和Java驱动程序。我有一个包含10万多条记录的集合。每天大约会有500次更新和500次插入,这些操作应该进行批处理。我将获得旧字段加上一些新字段的已更新文档,需要存储它们。我不知道哪些是新添加的字段,对于每个字段,我都在维护摘要统计信息。由于我不知道哪些是更改过的,所以我必须获取已存在的记录以查看更新的记录和新记录之间的区别,以适当地设置摘要统计信息。因此,我想了解如何有效地完成这项工作。
我应该删除现有记录并重新插入,还是应该更新500条记录?如果有潜在优势,是否应考虑执行1000个upser?
示例用例:初始记录包含:f=[185, 75, 186]。我将会收到更新请求,如:f=[185, 75, 186, 1, 2, 3],对于相同的记录。另外,上述摘要统计信息存储f中id的计数。因此,1、2、3的计数将增加,而185、75、186的计数保持不变。
3个回答

0

Upserts 用于在文档不存在时添加文档。因此,如果您期望有新的文档,则需要设置 {upsert: true}

为了更新您的统计数据,我认为最简单的方法是重新计算统计数据,如果您是在 mongo 中进行统计(例如使用聚合框架)。如果您正确地索引了文档,那么应该没问题。我假设您的统计更新是离线操作。

如果您没有在 mongo 中进行统计,则可以添加另一个 collection,在其中保存更新以及旧字段(当然还要更新当前集合),这样您就会知道哪些文档在一天中发生了更改。在一天结束时,您只需删除此临时/日志 collection,一旦提取所需信息即可。


谢谢!关于删除和插入与更新,你会选择哪一个? - Terminator
假设我的记录有字段a、b、c。第二天可能会添加一个新字段,它将具有字段a、b、c、d。旧字段值都不会被删除,因此无法删除a、b、c、d。但是可能会添加更多的字段。 - Terminator
我想这可能是更恰当的表达方式。 - Terminator
其实我需要存储完整的更新文档。但如果有一些有效的方法可以告诉我手头的记录和数据库中的记录之间的差异,那将非常有帮助。例如在数据库中,记录将是f = [185, 75, 186],而我将在我的API上获得一个请求来存储f = [185, 75, 186,1,2,3]。 - Terminator
如果您将更新和旧值保存在不同的集合中,那就完成了。如果您对此答案不满意,请在问题中添加一个实际示例,显示更新和您期望得到的结果。 - Pio
显示剩余6条评论

0
Mongo使用本地数据库中的oplog.rs capped集合来维护每个更改日志。我们基于时间戳在oplog.rs上创建可追溯的游标,并通过流媒体传输每个数据库/集合中的更改操作。相信这是识别mongo更改的最佳方式。人们可以放心地丢弃无关紧要的文档更改。更多阅读http://docs.mongodb.org/manual/reference/glossary/#term-oplog

谢谢,但我不能选择带上限的集合,因为我不知道我的数据库大小。但是对于更新大约500条记录,您会选择删除+插入还是更新? - Terminator

0

我认为最简单的方法是如果您在mongo中进行统计(例如使用聚合框架)就重新做。如果您正确索引upsers文档,那么应该没问题。我假设您的统计更新是离线操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接