首页 > 解决方案 > Mongoose - 使用 findOneAndUpdate 和数组过滤器仅返回更新的项目

问题描述

我有一个这样的架构:

documents [
  _id
  items [
    name
    type
    subitems [
      _id
      name
    ]
  ]
]

我想使用 、 、 和 的组合更新document.id一个item.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 一次性完成此操作,还是必须在获取后过滤结果?

标签: mongodbmongoose

解决方案


要仅显示必填字段,projection可以使用。由于您试图仅获取数组中的选定字段,filter因此这是目前 MongoDB 中唯一可用的选项。


推荐阅读