猫鼬更新整个嵌套元素

时间:2020-07-27 03:53:31

标签: mongodb mongoose

我正在使用mongoose和MongoDB。有什么办法可以更新架构中的整个日程表数组?还是我必须使用for循环并一个接一个地插入? 我的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
  }]
});

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以使用$ set更新整个时间表数组,请尝试如下操作:

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

在这里,您的请求正文应该是与您的架构中定义的键相同的数组。

答案 1 :(得分:0)

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

您可以参考此链接https://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate。 如链接所示,

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:'jason bourne'}覆盖文档。

因此,在您的情况下,我们只需要编写:

Schedule.findOneAndUpdate({_id: "id_of_object"}, {schedules: req.body});

那应该为你做。但是在内部,正如文档所说,它的发送方式为:

Schedule.findOneAndUpdate({_id: "id_of_object"}, {$set: {schedules: req.body}})

当然,这假设您的req.body仅包含日程表数组。您很可能是从前端将其作为对象发送的,因此它可能是req.body.object_name。由你决定。

相关问题