如何在更新文档中父数组的兄弟字段时将元素推入mongodb中的数组内的数组

时间:2017-10-23 09:15:01

标签: arrays mongodb mongoose

Hell devs,这是我的文档架构

var Schema = mongoose.Schema;

var botSchema = new Schema({
Bot_name: String,
UserName:String,
Modules: [{
    ModuleStatement: String,
    ModuleID: String,
    ModuleResponse: [{

        Response: String,
        TransBotID: String
    }]
}]
});

我想要做的是更新ModuleStatement以及将元素推送到ModuleResponse设置Response和TransBotID到某些值

我尝试过关注,但它只更新了ModuleStatement并且没有将元素推送到ModuleResponse

   botSchema.update({ 'Modules.ModuleID': req.body.ModId }, { '$set': { 'Modules.$.ModuleStatement': req.body.Statement } }, function (err, data) {
            if (err) {
                throw err;
            } else {


                botSchema.update({ "Modules.ModuleID": req.body.ModId }, { "$push": { "ModuleResponse": { "Response": req.body.Statement, "TransBotID": req.body.transitmod } } }, function (err, data) {
                    if (err) {
                        throw err;
                    }
                    else {
                        res.json('upgraded');
                    }
                })

            }
        })

如何在同时设置ModuleStatement的同时将元素推送到ModuleResponse?

2 个答案:

答案 0 :(得分:0)

$push仅适用于$group阶段。您可能想尝试以下内容:

botSchema.find({'Modules.ModuleID': req.body.ModId}, (err, bots) => {
    if (err) {
        throw err;
    } else {
        bots.forEach((bot) => {
            bot.modules.forEach((botModule) => {
                if (botModule.ModuleID == req.body.ModId) {
                    botModule.Statement = req.body.Statement;
                    botModule.ModuleResponse.push({
                        Response: req.body.Statement,
                        TransBotID: req.body.transitmod
                    })
                }
            });
            bot.save((err, data) => {
                if (err) throw err;
            });
        });
        res.json('upgraded');
    }
})

答案 1 :(得分:0)

这里有一个shell代码:

db.bot.update(
    { "Modules.ModuleID": "<some_id>" },
    {
        "$set": { "Modules.$.ModuleStatement": "<some_statement>" },
        "$push": {
            "Modules.$.ModuleResponse": {
                "Response" : "<some_response>", 
                "TransBotID" : "<some_trans_id>"
            }
        }
    }
)

问题是你can在一个更新文档中有多个更新表达式。我相信你可以很容易地把它转换成猫鼬。