首页 > 解决方案 > 在不更改对象 ID 的情况下更新嵌套对象数据

问题描述

我目前正在使用数组过滤器来更新嵌套对象。我的结构是 -

Category Collection - 
{
  name:Disease,
  _id:ObjectId,
  subCategory:[{
    name:Hair Problems,
    _id:ObjectId,
    subSubCategory:[{
       name: Hair Fall,
       _id:ObjectId
    },{
       name: Dandruff,
       _id:ObjectId
    }]
  }]
}

我想通过使用数组过滤器来更新 id 为 1.1.1 的子类别。

let query = { 'subCategories.subSubCategories._id': subSubId };
let update = { $set: { 'subCategories.$.subSubCategories.$[j]': data } };
let option = { arrayFilters: [{ 'j._id': subSubId }], new: true };

await Categories.findOneAndUpdate(query, update, option

此代码工作正常,但数组过滤器更改了 subsubCategory 的对象 ID。在不更改 ObjectId.

提前致谢

标签: javascriptnode.jsmongodbmongoosemongoose-schema

解决方案


问题在于$set您没有提到要更新的特定字段,而是subCategory.$.subSubCategory.$[j]替换与 _id 过滤器匹配的完整对象元素。因此,您的 _id 字段也正在更新。您必须在数组元素标识符之后明确提及字段名称。请参见下面的示例:

假设您要更新from中的name字段to 。然后这样做:subSubCategoriesDandruffnew Dandruff

let update = { $set: { 'subCategories.$.subSubCategories.$[j].name': "new Dandruff" } };

这只会更新数组name中的字段subSubCategories


推荐阅读