【问题标题】:Update a collection of documents with mongodb使用 mongodb 更新文档集合
【发布时间】:2015-04-22 08:30:30
【问题描述】:

我在 mongo 集合中有以下两个文档:

{
    _id: "123",
    name: "n1"
}

{
    _id: "234",
    name: "n2"
}

假设我阅读了这两个文档并进行了更改,例如添加“!”到名字的末尾。 我现在想将这两个文档保存回来。

对于单个文档,有保存,对于新文档,我可以使用插入来保存文档数组。

保存这两个文档的更新的解决方案是什么?更新命令要求查询,但我不需要查询,我已经有了文档,我只想将它们保存回来...

我可以一个一个地更新,但如果是 200 万个文档而不是两个,那么效果就不太好了。

要补充一点:我们目前使用的是 Mongo v2.4,如果批量操作是解决此问题的唯一解决方案(正如 2.6 中添加的那样),我们可以迁移到 2.6

【问题讨论】:

    标签: mongodb insert-update documents


    【解决方案1】:

    为此,您有 2 个选项(存在于 2.6 中),

    1. Mongoimport、mongorestore 等批量操作。

    2. 每个文档的Upsert 命令。

    第一个选项更好,没有大号。文件(这是你的情况)。在 Mongoimport 中,您可以使用 --upsert 标志覆盖现有文档。您可以使用--upsert --drop 标志来删除现有数据并设置新文档。

    在 IO 和系统实用程序方面,此选项适用于大量数据。

    Upsert 命令的工作原理是就地更新。您可以将它与过滤器一起使用,但缺点是它以串行方式工作,不应用于大数据量。仅在小数据时表现出色。

    【讨论】:

      【解决方案2】:

      当您关闭write concerns 时,save 不会阻塞,直到数据库写入并几乎立即返回。因此,使用WriteConcern.Unacknowledged,使用save 存储200 万个文档比您想象的要快得多。但是没有写关注的缺点是你不会从数据库中得到任何错误。

      当您不想一个一个地保存它们时,批量操作是可行的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-14
        相关资源
        最近更新 更多