Mongodb Mongoose更新整个嵌套元素

Mongodb Mongoose更新整个嵌套元素,mongodb,mongoose,Mongodb,Mongoose,我正在使用mongoose和MongoDB。是否有任何方法可以更新架构中的整个计划数组?还是必须使用for循环并逐个插入? My req.body是一个数组,用于替换整个schedules数组对象 [{"_id":"1","description":"hi","time":"Jul 29, 2020 8:55 PM","url":"aaa.com&

我正在使用mongoose和MongoDB。是否有任何方法可以更新架构中的整个计划数组?还是必须使用for循环并逐个插入? My req.body是一个数组,用于替换整个schedules数组对象

[{"_id":"1","description":"hi","time":"Jul 29, 2020 8:55 PM","url":"aaa.com"},{"_id":"2","description":"hi","time":"Jul 29, 2020 8:58 PM","url":"bbb.com"},{"_id":"3","description":"hi"}]
这是我的模式

const schedule = new mongoose.Schema({
  user_id: Number,
  schedules: [{
    description: String,
    time: String,
    url: String
  }]
});

谢谢。

您可以使用$set更新整个计划数组,请尝试以下操作:

db.collection.update({query},{ $set: { schedules: req.body } },{option});

在这里,您的req.body应该是具有与模式中定义的相同键的数组。

如果您使用mongoose,我们可以避免使用
$set
@jitendra的答案是一个纯mongodb查询,您可以在MongoShell中运行它

你可以参考这个链接。 正如链接所说

var query = { name: 'borne' };
Model.findOneAndUpdate(query, { name: 'jason bourne' }, options, callback)

// is sent as
Model.findOneAndUpdate(query, { $set: { name: 'jason bourne' }}, options, callback)
这有助于防止意外地用{name:'jasonbourne'}覆盖您的文档

所以在你的情况下,我们只需要写:

Schedule.findOneAndUpdate({u id:{u对象的id},{schedules:req.body})

那应该对你有用。但在内部,正如doc所说,它被发送为:

Schedule.findOneAndUpdate({u id:{u对象的id},{$set:{schedules:req.body}})

当然,这假定您的
req.body
仅由计划数组组成。很可能是从前端将其作为对象发送,因此可能是
req.body.object\u name
。由你决定