猫鼬-使用findOneAndUpdate和数组过滤器仅返回更新的项目

时间:2019-01-07 21:29:38

标签: mongodb mongoose

我有一个类似的架构:

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一次性完成此操作,还是必须在提取后过滤结果?

2 个答案:

答案 0 :(得分:0)

是的,您将不得不对其进行过滤,因为猫鼬在findOneAndUpdate方法中不支持这种功能... 完成更新后,它将返回完整对象。

答案 1 :(得分:0)

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