更新猫鼬对象数组

时间:2018-10-20 21:31:09

标签: javascript node.js mongodb api mongoose

我知道这个问题可能是初学者,但是我还没有找到任何东西。 我想用mongoose更新对象数组。我有兴趣根据索引从users数组更新一个对象。 通常,一次更改一个用户。

这是我的模式:

 _id: Schema.Types.ObjectId,
name: { type: String, required: true },
gm: {
    type: Schema.Types.ObjectId,
    ref: 'User',
    required: true
},
users: [],

我要更新users数组中的对象,如下所示:

{
    id:"5bcb7c7ff9c5c01b9482d244",
    gm:"5bcb7c7ff9c5c01b9482d246",
    name:"room 1"
    users: [
        {
            id:"5bcb7c7ff9c5c01b9482d243",
            stats:{
                power:10,
                mobility: 5,
                vitality: 20
            },
            bag:{itemSlot1: "Knife",itemSlot2:"Sword" }
        },
        {
            id:"5bcb7c7ff9c5c01b9482d241",
            stats:{
                power:10,
                mobility: 5,
                vitality: 20
            },
            bag:{itemSlot1: "Knife",itemSlot2:"Sword" }
    ]
}

我想执行一次patchpost请求,以每次从用户数组中更新一个用户。我从req.body获取用户ID,以使其与我的数据库匹配。

我的请求是这样的:

我想根据这样的请求进行更新:

data = {
  stats={
    power:"10",
    vitality:"20"
   }
}

预先感谢, 干杯

2 个答案:

答案 0 :(得分:1)

您可以像这样进行更新:

YourSchema.update({
  'users.id': '5bcb7c7ff9c5c01b9482d243'
}, {
  $set: {
    'users.$.stats': data.stats
  }
})

哪个ID(5bcb7c7ff9c5c01b9482d243 power统计信息的第一个用户更新为20

这是结合使用update$ positional operator来更新数组中的元素。

只需在您的帖子/补丁请求中进行设置。

答案 1 :(得分:0)

您应该使用id来检索用户的req.params,但是由于您是从正文中检索出来的,因此我的回答将基于此:

app.put('/api/users/:user_id', function(req, res) {
    var id = req.body.id;
    var newUser = req.body.user;
    User.findById(id, function (err, user) {
        if (err) return handleError(err);

        user.set(newUser);
        user.save(function (err, updatedUser) {
            if (err) return handleError(err);
            res.send(updatedUser);
        });
    });
});