【问题标题】:update nested Object data without changing Object Id在不更改对象 ID 的情况下更新嵌套对象数据
【发布时间】:2020-03-19 13:50:21
【问题描述】:

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

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 的情况下是否有其他替代方法。

提前致谢

【问题讨论】:

  • 您要准确更新哪个属性?
  • 用户可以更新 subsubCategory @AmitDas 中存在的任何属性

标签: javascript node.js mongodb mongoose mongoose-schema


【解决方案1】:

您可以遍历作为有效负载获取的密钥并将其放入 $set 运算符中。

const data = {
  firstKey: "key",
  secondKey: "key2",
  thirdKey: "key3"
}
const object = {}

for (var key in data) {
  object[`subCategories.$.subSubCategories.$[j].${key}`] = data[key]
}

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

await Categories.findOneAndUpdate(query, update, option)

【讨论】:

    【解决方案2】:

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

    假设您要将subSubCategories 中的name 字段从Dandruff 更新为new Dandruff。然后这样做:

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

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

    【讨论】:

    • 我同时更新多个字段,所以我必须提到每个字段。
    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 2019-02-03
    • 2021-12-10
    • 2014-06-09
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多