给出以下架构:
const item = {
_id: false,
amount: { type: Number, required: true },
};
const item_schema = new Schema({ item_history: [item] });
const parent_schema = new Schema({
...
items: [item_schema],
...
})
和数据库中的这个文件
{
...
items: [{ _id: 1, item_history: [{ amount: 10 }] }]
...
}
我想说我想用这些项目更新本文档:
const changed_or_new_items = [{ _id: 1, amount: 20 }, { amount: 30 }];
哪个应该在数据库中产生这个对象:
{
...
items: [{ _id: 1, item_history: [{ amount: 10 }, { amount: 20}] },
{ _id: 2, item_history: [{ amount: 30 }] }]
...
}
这就是我目前更新文档的方式:
const parent = await Parent.findOne(some_query).exec();
changed_or_new_items.forEach(item => {
if (!item._id) {
parent.items.push({ item_history: [item] });
}
else {
const item_doc = parent.items.id(item._id);
item_doc.item_history.push(_.omit(item, '_id'));
}
});
await parent.save();
以上是否有可能实现使用更新操作,例如findOneAndUpdate
如果是,如何?
答案 0 :(得分:1)
您可以将 findOneAndUpdate
与arrayFilters
一起使用:
Parent.findOneAndUpdate(
{ 'items._id': 1 },
{ '$set': { 'items.$.item_history.$[element].amount': 30 } },
{
'arrayFilters': [ {'element.amount': 20} ],
'new': true,
'upsert': true
}, (err, updatedParent ) => {
if (err) res.status(400).json(err);
res.status(200).json(updatedParent);
}
);