Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更新对象数组mongoose_Javascript_Node.js_Mongodb_Api_Mongoose - Fatal编程技术网

Javascript 更新对象数组mongoose

Javascript 更新对象数组mongoose,javascript,node.js,mongodb,api,mongoose,Javascript,Node.js,Mongodb,Api,Mongoose,我知道这个问题可能是初学者的水平,但我还没有找到任何东西。 我想用mongoose更新对象数组。我感兴趣的是根据索引更新用户数组中的一个对象。 通常一次只更换一个用户 这是我的模式: _id: Schema.Types.ObjectId, name: { type: String, required: true }, gm: { type: Schema.Types.ObjectId, ref: 'User', required: true }, users: [],

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

这是我的模式:

 _id: Schema.Types.ObjectId,
name: { type: String, required: true },
gm: {
    type: Schema.Types.ObjectId,
    ref: 'User',
    required: true
},
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" }
    ]
}
data = {
  stats={
    power:"10",
    vitality:"20"
   }
}
我想执行
补丁
post
请求,每次从用户数组更新一个用户。我正在从
req.body
获取用户id,以便与我的数据库匹配

我的要求如下:

{
    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" }
    ]
}
data = {
  stats={
    power:"10",
    vitality:"20"
   }
}
我想根据如下请求进行更新:

{
    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" }
    ]
}
data = {
  stats={
    power:"10",
    vitality:"20"
   }
}
提前感谢,,
干杯

您可以执行如下更新:

YourSchema.update({
  'users.id': '5bcb7c7ff9c5c01b9482d243'
}, {
  $set: {
    'users.$.stats': data.stats
  }
})
这将使用id将第一个用户更新为
5bcb7c7ff9c5c01b9482d243
power
stats至
20

这是使用与来更新数组中的元素


只需在post/patch请求中设置即可。

我已更新了答案。只需使用
数据设置
。stats
,然后。如果我也得到一个包对象,并且请求中缺少一些密钥对,该怎么办?这是在
更新
调用之前可以在请求中执行的操作。如果
数据
没有您想要的数据等,您可以使用默认值。我只是向mongoose提供请求,而不是整个请求处理程序。我可以创建一个动态$set并只更新我得到的值吗?您可以简单地组合set对象,只需添加要更新的道具:
{'users.$.stats.power':data.stats.power,'users.$.stats.other':data.stats.other}
基于您在
data.stats