【问题标题】:Query documents, update it and return it back to MongoDB查询文档,更新它并返回给 MongoDB
【发布时间】:2016-02-01 22:27:23
【问题描述】:

在我的基于 MongoDB 3.2 的应用程序中,我想执行文档处理。为了避免对同一个文档的重复处理,我想更新它的标志,并在数据库中更新这个文档。

可能的方法是:

  1. 查询数据:FindIterable<Document> documents = db.collection.find(query);
  2. 对这些文档执行一些业务逻辑。
  3. 遍历documents,更新每个文档并将其存储在新集合中。
  4. 使用db.collection.updateMany(); 将新集合推送到数据库。

理论上,这种方法应该可行,但我不确定它是否是最佳方案。

我的问题:
MongoDB Java API中是否有任何方法可以执行以下两个操作:

  1. 查询文档(从数据库中获取它们并传递给单独的方法);
  2. 更新它们,然后将更新的版本存储在数据库中;

与上述建议的方法相比,以更优雅的方式?

【问题讨论】:

    标签: mongodb mongodb-query insert-update database


    【解决方案1】:

    您可以使用update就地更新文档:

    db.collection.update(
        {query},
        {update},
        {multi:true}
    );
    

    它将遍历集合中与query 匹配的所有文档,并更新update 中指定的字段。

    编辑:

    要将一些业务逻辑应用于单个文档,您可以迭代匹配的文档,如下所示:

    db.collection.find({query}).forEach(
        function (doc) {
            // your logic business
            if (doc.question == "Great Question of Life") {
                doc.answer = 42;
            }
            db.collection.save(doc);
        }
    )
    

    【讨论】:

    • 如果除了需要更新这些文档之外,我还想获取它们以进行进一步处理怎么办?换句话说,我想获取文档,使用它们,将它们标记为已处理,然后才将它们返回到数据库。
    • 那么问题确实太宽泛了。
    • 我试图缩小并指定问题。请查看更新版本。
    • 好的,我已经用另一个例子更新了答案,但是在 mongodb 中处理文档的方法还有很多。您可能需要了解数据库的能力,或聘请顾问为您的案例制定最佳方法。您的 1..4/1..2 点适用于任何持久性存储,并且不是特定于 mongodb。
    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 2014-09-04
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多