【问题标题】:Updating documents with nested arrays based on conditions根据条件使用嵌套数组更新文档
【发布时间】:2017-12-12 09:26:25
【问题描述】:

我是 MongoDB 的新手,必须处理一个不是我创建的遗留项目......而且我很挣扎!

我需要根据特定的字段值重置我的一个集合中的一些文档。到目前为止,我在这方面取得了一些成功,但我需要更新的一些数据位于该文档的嵌套数组中,我无法解决这部分问题。

以下是集合中一个文档的示例:

{
    "_id" : ObjectId("1234567890"),
    "currentStatus" : "approved",
    "itemsInstalled" : [ 
        {
            "installDate" : ISODate("2017-04-18T00:00:00.000Z"),
            "_id" : ObjectId("1234567890"),
            "status" : "approved"
        }, 
        {
            "installDate" : ISODate("2017-04-18T00:00:00.000Z"),
            "_id" : ObjectId("0987654321"),
            "status" : "approved"
        }
    ],
    "__v" : 5005,
    "approvalDate" : ISODate("2017-12-04T10:40:01.580Z"),
    "approvedBy" : "automatic"
}

我需要更新集合中approvedBy 字段设置为automatic每个文档,而其他文档保持不变。

对于我正在更新的文档,我需要完全删除approvalDateapprovedBy字段,将currentStatus字段更改为action并更改everyitemsInstalled 数组中的项目添加到 pending。其他一切都可以保持原样。

如果我有更多时间,我会坚持自己解决这个问题。

【问题讨论】:

  • 这在 3.6 版本(几天前发布)中很简单,并带有富有表现力的更新。 db.collection_name.update( {"approvedBy": "automatic"}, {$set: {"itemsInstalled.$[].status": "pending", currentStatus:"action"}, $unset: {approvalDate: "",approvedBy: ""}} )。更多 here 使用情况

标签: mongodb mongodb-query


【解决方案1】:

很遗憾,据我所知,您无法更新多个数组元素。您最好的选择可能是使用forEach。您可以通过以下方式完成您想要的:

db.your_collection.find({
    approvedBy: "automatic"
}).forEach(function(doc) {
    for(var i = 0; i < doc.itemsInstalled.length; i++) {
        doc.itemsInstalled[i].status = "pending";
    }

    doc.currentStatus = "action";
    delete doc.approvedBy;
    delete doc.approvalDate;

    db.your_collection.update({_id: doc._id}, doc);
});

使用forEach,您可以一次更新所有数组元素。缺点是您将执行多个更新查询,因此您应该小心在特别大的集合上或作为应用程序逻辑的一部分执行此操作。理想情况下,这应该是一次性使用场景。

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2015-07-13
    • 2016-11-23
    • 2016-10-06
    • 1970-01-01
    • 2013-03-19
    相关资源
    最近更新 更多