问题描述
我目前在尝试更新 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
}
}
],.....
如您所见,每条记录的地址数组都包含许多地址。我希望能够通过更新对象并更新特定数组对象内的 addressInfo 嵌套对象内的属性。这是我的查询:
const updated = await db.models.customers.findOneAndUpdate(
{
_id: customer._id,'addresses.addressId': addressData.addressId
},{ $set: { 'addresses.$': addressData } },{ new: true }
);
以及我用来更新记录的对象示例:
{
addressId: officialAddressExists.addressId,addressInfo: {
validTo: new Date().toISOString()
}
}
我想要发生的是,当我将此对象传递给架构方法时,我想通过值“kimCustomerId”和“addressId”(我工作正常)选择正确的地址,然后只更新我传递的“addressInfo”嵌套对象并保留未传递的对象,在本例中为“validTo”字段,但可以更新任意数量的对象。目前它正在覆盖整个“addressInfo”nestedobject,所以我认为我也必须对该嵌套对象进行某种设置操作,但我不确定如何操作。 有人能在这里指出我正确的方向吗? 谢谢!
解决方法
在查询中没有直接的方法可以做到这一点,您可以在客户端进行,例如
// 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 }
);