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.iditem.nameitem.typesubitem.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() 时查询挂起

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

Egg中使用egg-mongoose和常用的Mongoose 方法