【问题标题】:how to update nested object of mongoose document for only provided keys如何仅为提供的键更新猫鼬文档的嵌套对象
【发布时间】:2018-08-14 18:32:05
【问题描述】:

我将根据提供的键更新 mongoose 文档的一些字段。 例如, 当我们在 json 中呈现 mongoose 文档时。

user: {
  address: {
    city: "city"
    country: "country"
  }
}

更新参数是这样给出的。

address: {
   city: "city_new"
}

当我像这样运行 mongoose api 时。

let params = {
   address: {
      city: "city_new"
   }
}
User.set(param)

它替换整个地址对象,最终结果是

user: {
  address: {
    city: "city_new"
  }
}

它只是替换地址字段,但我只想更新城市字段。 这是想要的结果。

user: {
  address: {
    city: "city_new"
    country: "country"
  }
}

如何在猫鼬中做到这一点?

当嵌套对象有更复杂的层次结构时,如果不手动指出address.city.field1.field2. ...这样的字段,我们如何解决这个问题

谢谢

【问题讨论】:

  • 您必须使用 .Dot 表示法来更新嵌套字段,否则将它们移动到根级别

标签: node.js mongodb mongoose nested


【解决方案1】:

当嵌套对象具有更复杂的层次结构时,我们如何解决这个问题 无需手动指示 address.city.field1.field2 等字段。

正如大多数答案所暗示的那样,您必须使用 dot notation 来更新嵌入式文档并回答您的上述问题,请使用以下辅助方法,该方法应用递归将给定对象转换为其点符号表示:

function convertToDotNotation(obj, newObj={}, prefix="") {

  for(let key in obj) {
      if (typeof obj[key] === "object") {
          convertToDotNotation(obj[key], newObj, prefix + key + ".");
      } else {
          newObj[prefix + key] = obj[key];
      }
  }

  return newObj;
}


let params = {
   address: {
      city: {
         location: {
            street: "new street"
         }
      }  
   }
};

const dotNotated = convertToDotNotation(params);
console.log(JSON.stringify(dotNotated, null, 4));

【讨论】:

    【解决方案2】:

    这应该可行:

    let params = {
       "address.city": "city_new"
    }
    User.set(param)
    

    $set 的文档中,您还可以找到以下备注:

    要在嵌入文档或数组中指定 ,请使用点 符号。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 2014-07-13
    • 2020-09-06
    • 2019-09-30
    • 1970-01-01
    相关资源
    最近更新 更多