更新节点js mongoDB中的嵌套数组元素值

时间:2016-06-06 06:10:53

标签: arrays node.js mongodb

您好我是nodejs中的新手我需要使用文档的_id更新嵌套数组中的值我的数据库文档看起来像这样..

"complaints" : [ 
    {
        "complaint" : "head light is not working",
        "complaintid" : ObjectId("57205219a56d2b8c0f9274a4"),
        "_id" : ObjectId("57454c9249218eb40c1c0d1f"),
        "labour" : 350,
        "partCost" : 0,
        "part" : [ 
            {
                "id" : ObjectId("56f12eaab915bd9800272ed7"),
                "estimate" : 450,
                "partname" : "clutch",
                "_id" : ObjectId("57454cef49218eb40c1c0d25"),
                "quantity" : 0,
                "qrcodes" : []
            }, 
            {
                "id" : ObjectId("56f12eaab915bd9800272ed7"),
                "estimate" : 450,
                "partname" : "rear tyre",
                "_id" : ObjectId("57454cef49218eb40c1c0d24"),
                "quantity" : 0,
                "qrcodes" : []
            }
        ],
        "acceptance" : true,
        "inspection" : false,
        "color" : "#8929A9",
        "status" : "APPROVED",
        "estimate" : 1200,
        "solution" : "HEAD LIGHT CHANGE",
        "problems" : "HEAD LIGHT IS NOT WORKING"
    }, 

我需要使用零件数组的_id来更新零件数组中存在的零件数组的数量值

我正在尝试这个,但它不起作用我该怎么做才能更新这个值......

var partdata = req.payload.parts;
                for(var k = 0; k< partdata.length ; k++ ){
                    CPS.update({
                        'complaints.part._id' : partdata[k].partid
                    }, {
                        "$inc" : {                              
                            'complaints.part.$.quantity' : partdata[k].quantity                             
                        }
                    }).exec
                    (function(err,temp) {
                        if(err){
                            res(err).code(500);
                        }else{
                            console.log(temp);
                        }
                    });
                }

1 个答案:

答案 0 :(得分:0)

  

MongoDB不支持匹配到阵列的多个级别。   考虑更改您的文档模型,以便每个文档代表一个   操作,具有一组操作重复的共同信息   在操作文件中。

以下不是您案例的解决方案。 但是如果您知道索引,那么您可以执行以下操作: 假设示例文档如:

{
    "_id" : ObjectId("57454c9249218eb40c1c0d1f"),
    "part" : [{ "quantity" : 111 }, { "quantity" : 222 }]
}

然后这个查询应该有用。

db.test.update({ "_id" : ObjectId("57454c9249218eb40c1c0d1f") }, { "$set" : { "part.1.quantity" : 999 } })

文件将按如下方式修改:

{
    "_id" : ObjectId("57454c9249218eb40c1c0d1f"),
    "array" : [{ "quantity" : 222 }, { "quantity" : 999 }]
}

<小时/> 更新:您可以尝试以下方式进行更新。但它不建议的做法可能需要重新构建您的架构。

db.test.aggregate([     
    { "$unwind": "$complaints" },     
    { "$unwind": "$complaints.part" },
    { "$project":
        { 
            _id: "$complaints.part._id",
            partqty: "$complaints.part.quantity"
        } 
    },
]);

这应该返回如下:

{
    "_id" : ObjectId("57454cef49218eb40c1c0d25"),
    "partqty" : 111
}
{
    "_id" : ObjectId("57454cef49218eb40c1c0d24"),
    "partqty" : 222
}

现在您可以使用此信息进行更新,例如

var cur =  db.test.aggregate([     
        { "$unwind": "$complaints" },     
        { "$unwind": "$complaints.part" },
        { "$project":
            { 
                _id: "$complaints.part._id",
                partqty: "$complaints.part.quantity"
            } 
        },
    ]);

    while (cur.hasNext()) {
        var doc = cur.next();
        //Note the index should be know again :|
        db.test.update({ "complaints.part._id":  ObjectId("57454cef49218eb40c1c0d25") },
                      { "$set": { "complaints.$.part.1.quantity": 55 }},
                      { "multi": true})
    }