代码之家  ›  专栏  ›  技术社区  ›  Nomura Nori

如何只为提供的键更新Mongoose文档的嵌套对象

  •  2
  • Nomura Nori  · 技术社区  · 6 年前

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

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

    更新参数是这样给出的。

    address: {
       city: "city_new"
    }
    

    当我像这样运行MongooseAPI时。

    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. ...

    谢谢

    2 回复  |  直到 5 年前
        1
  •  3
  •   Community T.Woody    5 年前

    当嵌套对象具有更复杂的层次结构时,我们如何解决这个问题? 不带手动指示字段,如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
  •  1
  •   dnickless    6 年前

    这应该有效:

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

    在文档中 $set 您还可以看到以下注释:

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