【问题标题】:Mongo delete and insert vs updateMongo删除和插入与更新
【发布时间】:2015-04-10 20:05:06
【问题描述】:

我正在使用 mongo 3.0 版 db 和 java 驱动程序。我收集了 100,000 多个条目。每天将有大约 500 次更新和大约 500 次插入,应该分批完成。我将获得包含旧字段的更新文档以及一些我必须存储的新文档。我不知道对于每个字段新添加了哪些字段,我正在维护一个汇总统计信息。由于我不知道发生了什么变化,我将不得不获取已经存在的记录以查看更新记录和新记录之间的差异以适当地设置汇总统计信息。所以我想了解如何有效地完成这项工作。

我应该删除现有记录并重新插入,还是应该更新 500 条记录。如果有潜在的优势,我是否应该考虑做 1000 个 upsers。

示例用例 初始记录包含:f=[185, 75, 186]。对于同一条记录,我将以 f=[185, 75, 186, 1, 2, 3] 的形式获得更新请求。上面提到的汇总统计信息也将 id 的计数存储在 f 中。因此,1、2、3 的计数将增加,而 185、75、186 的计数将保持不变。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    Upserts 用于添加不存在的文档。因此,如果您期待新文档,那么可以,设置{upsert: true}。

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

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

    【讨论】:

    • 谢谢!关于删除和插入与更新,您会选择哪一个?
    • 您应该update 您的记录,因为这是一个单一的操作,其中delete 和insert 是两个。但我不确定你所说的“加上一些我必须存储的新的”是什么意思。你能举个例子吗?
    • 所以可以说我的记录有字段 a、b、c。第二天可能会添加一个新字段,它将包含字段 a、b、c、d。不会删除任何旧字段值,因此无法删除 a、b、c、d。但可能会添加更多字段。
    • 你的领域有什么?它是一个巨大的哈希图吗?
    • 实际上数据是这样的 f=[185, 75, 186] 我实际上是在存储存储一个集合在 db 中。并且可以添加像 1,2,3 等这样的新 id 以使其 f=[185, 75, 186,1,2,3] 我认为在大多数情况下它不会超过 10。
    【解决方案2】:

    Mongo 使用本地数据库中的 oplog.rs 上限集合维护每个更改日志。我们正在基于时间戳在 oplog.rs 上创建一个可尾游标,并且 db/collection 中的每个更改都通过流式传输。相信这是识别 mongo 变化的最好方法。一个当然可以丢弃没有兴趣的文件更改。 进一步阅读http://docs.mongodb.org/manual/reference/glossary/#term-oplog

    【讨论】:

    • 谢谢,但我不能选择有上限的集合,因为我不知道我的数据库大小。但是要更新大约 500 条记录,您会选择删除+插入或更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多