猫鼬更新记录数组中的嵌套对象

Mongoose update nested object in array of record

我目前遇到一个问题,我正在尝试更新 Mongoose record.My 架构中的嵌套数组,如下所示:

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()
    }
 }

我想要发生的是,当我将这个对象传递给模式方法时,我想 select 通过值 '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 }
);