我正在使用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
}]
});
谢谢。
答案 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
。由你决定。