根据条件

时间:2017-12-10 22:30:54

标签: mongodb mongodb-query

我是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并将itemsInstalled数组中的每个项更改为pending。其他所有东西都可以保持不变。

如果我有更多时间,这是我坚持解决自己的事情。

1 个答案:

答案 0 :(得分:0)

不幸的是,据我所知,您无法更新多个数组元素。你最好的选择可能是使用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,您可以一次更新所有数组元素。缺点是您将执行多个更新查询,因此您应该特别注意在特别大的集合上执行此操作或作为应用程序逻辑的一部分。理想情况下,这应该是一次性使用场景。