如何在Mongoose中从多个数组更新数组内的值?

时间:2015-02-05 05:07:53

标签: javascript node.js mongodb express mongoose

我有一个User mongodb结构,如下所示。

{
"_id" : ObjectId("54d2f68edbe2337d000e1568"),
"username" : "khayusaki@gmail.com",
"organization" : [ 
    {
        "idOrganization" : "54c8b01af927db992d021f58",
        "usertype" : 1,
        "displayname" : "K",
    },
    {
        "idOrganization" : "54c8b01af927db992d021f60",
        "usertype" : 2,
        "displayname" : "Khay",
    }
],
"__v" : 0
}

这意味着用户可以拥有许多组织,每个displayname和usertype都依赖于它。我想要做的是,我只想通过使用请求体中的JSON来更新一个组织的displayname

{
"Displayname" : "Khay Usaki",
"Email" : "khayusaki@gmail.com"
}

我的猫鼬查询如下所示。

User.findOne({username: req.body.Email},
            {organization: {$elemMatch: {idOrganization: '54c8b01af927db992d021f58'}}},     
                function(err, user) {
                    if (err) res.send(err);

                    user.organization[0].displayname = req.body.Displayname;
                    user.save();
                    res.json({'message' : 'User successfully updated'});
                }
});

如果我在console.log(user)功能之前添加save(),它会给我我想要的内容。

{   
_id: 54d2f68edbe2337d000e1568,
organization: 
[ 
    { 
        idOrganization: '54c8b01af927db992d021f58',
        usertype: 1,
        displayname: 'Khay Usaki',
    } 
] 
}

但它真的没有保存。我希望有人可以帮我找到解决方案。

P.S。我在$push中使用了User.findOne进行了尝试,但它也无效。

===解决方案===== 感谢@BatScream的建议,它的工作如下。

User.findOneAndUpdate({
    username: req.body.Email,
    organization: {$elemMatch: {idOrganization: "54c8b01af927db992d021f58"}}
},
{$set: {"organization.$.displayname": req.body.Displayname}}, {},
function(err, response) {
    // handle own response
});

2 个答案:

答案 0 :(得分:1)

您可以在$方法中使用findOneAndUpdate位置运算符。

 Model.findOneAndUpdate({"username": req.body.Email,
         "organization.idOrganization":"54c8b01af927db992d021f58"},
         {$set:{"organization.$.displayname":req.body.Displayname}},
         {},
 function(err,resp){//handle response})

答案 1 :(得分:0)

尝试

user.organization.add(another_orginaztion);