我有一个类似的架构:
documents [
_id
items [
name
type
subitems [
_id
name
]
]
]
我想使用document.id
,item.name
,item.type
和subitem.id
的组合来更新子项目。我有一个使用Mongoose的工作findOneAndUpdate查询。
db.models.Document.findOneAndUpdate(
{ _id: mongoose.Types.ObjectId(document.id), 'items.name': item.name, 'items.type': item.type },
{ $set: { 'items.$.subitems.$[subitem].name': 'New Name' } },
{
fields: { _id: 0, 'items.$.subitems': 1 },
arrayFilters: [
{ 'subitems._id': mongoose.Types.ObjectId(subitem.id) }
]
},
(err, section) => {
console.log(section);
}
);
反过来,此查询返回:
{ items: [ subitems: [{ _id: 'IDHERE', name: 'NAME' }, { _id: 'IDHERE2', name: 'NAME2' }], name: 'Name', type: 'Type' } ] }
但是,我只希望查询使用数组过滤器更新的确切子项。
{ _id: 'IDHERE', name: 'NAME' }
我可以使用Mongo一次性完成此操作,还是必须在提取后过滤结果?
答案 0 :(得分:0)
是的,您将不得不对其进行过滤,因为猫鼬在findOneAndUpdate方法中不支持这种功能... 完成更新后,它将返回完整对象。
答案 1 :(得分:0)
要仅显示必填字段,可以使用projection
。由于您试图仅获取数组中的选定字段,因此filter
是MongoDB中当前存在的唯一可用选项。