[英]Mongoose update nested object in array of record
我目前遇到一個問題,我正在嘗試更新 Mongoose 記錄中的嵌套數組。我的架構如下:
const customerSchema = new mongoose.Schema({
kimCustomerId: {
type: Number,
required: true
},
addresses: [
{
created: Date,
updated: Date,
addressInfo: {
type: { type: String },
typeOfAddress: String,
careOf: String,
address: String,
addressRow1: String,
addressRow2: String,
zipcode: String,
city: String,
countryCode: String,
physicalAddressType: String,
validFrom: Date,
validTo: Date
}
}
],
.....
如您所見,每條記錄的地址數組包含許多地址。 我希望能夠通過更新 object 並更新在特定數組 object 內嵌套 object 的 addressInfo 內的屬性。 這是我的查詢:
const updated = await db.models.customers.findOneAndUpdate(
{
_id: customer._id,
'addresses.addressId': addressData.addressId
},
{ $set: { 'addresses.$': addressData } },
{ new: true }
);
以及我通過以更新記錄的 object 的示例:
{
addressId: officialAddressExists.addressId,
addressInfo: {
validTo: new Date().toISOString()
}
}
我想要發生的是,當我將此 object 傳遞給模式方法時,我想通過值“kimCustomerId”和“addressId”(我工作正常)為 select 提供正確的地址(我工作正常)然后只更新“addressInfo”的值' 已通過的嵌套 object 並保留未通過的那些,在本例中為 'validTo' 字段,但它可以是任意數量的更新。 它目前正在覆蓋整個“addressInfo”nestedObject,所以我認為我還必須對該嵌套的 object 進行某種設置操作,但我不確定如何操作。 有人能在這里指出我正確的方向嗎? 謝謝!
在查詢中沒有直接的方法可以執行此操作,您可以在客戶端執行此操作,例如,
// Sample body request let addressData = { addressId: 1, addressInfo: { validTo: new Date().toISOString(), typeOfAddress: "Home", address: "ABC" } }; let set = {}; for (let key in addressData.addressInfo) { set["addresses.$.addressInfo." + key] = addressData.addressInfo[key]; } console.log(set);
set
變量傳遞給您的查詢,
const updated = await db.models.customers.findOneAndUpdate(
{
_id: customer._id,
'addresses.addressId': addressData.addressId
},
{ $set: set },
{ new: true }
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.