Mongoose - 使用 findOneAndUpdate 和数组过滤器只返回更新的项目
Posted
技术标签:
【中文标题】Mongoose - 使用 findOneAndUpdate 和数组过滤器只返回更新的项目【英文标题】:Mongoose - Return Only Updated Item using findOneAndUpdate and Array Filters 【发布时间】:2019-06-02 13:50:54 【问题描述】:我有这样的架构:
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 一次性完成,还是必须在获取后过滤结果?
【问题讨论】:
【参考方案1】:要仅显示必填字段,可以使用projection
。由于您试图仅获取数组中的选定字段,filter
是目前 MongoDB 中唯一可用的选项。
【讨论】:
【参考方案2】:是的,你必须在之后过滤它,因为 mongoose 不支持 findOneAndUpdate 方法中的那种功能...... 它在执行更新后返回完整的对象。
【讨论】:
以上是关于Mongoose - 使用 findOneAndUpdate 和数组过滤器只返回更新的项目的主要内容,如果未能解决你的问题,请参考以下文章
在多个文件中使用 Mongoose Schema (mongoose)
使用 Mongoose / mongoose-dbref 使用和填充(真实的)DBRef 数组
NestJS 和 Mongoose 使用 Mongoose-Sequence
使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起