首页 > 解决方案 > 如何仅为提供的键更新猫鼬文档的嵌套对象

问题描述

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

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

并且更新参数是这样给出的。

address: {
   city: "city_new"
}

当我像这样运行猫鼬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. ...

谢谢

标签: node.jsmongodbmongoosenested

解决方案


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

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

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));


推荐阅读