簡體   English   中英

如何僅為提供的密鑰更新mongoose文檔的嵌套對象

[英]how to update nested object of mongoose document for only provided keys

我將根據提供的密鑰更新mongoose文檔的某些字段。 例如,當我們在json中呈現mongoose文檔時。

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

更新params就是這樣給出的。

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. ...字段的情況下解決此問題address.city.field1.field2. ... address.city.field1.field2. ...

謝謝

當嵌套對象具有更復雜的層次結構時,如何在不手動指示address.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)); 

這應該工作:

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

$ set的文檔中,您還會找到以下注釋:

要在嵌入文檔或數組中指定<field>,請使用點表示法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM