猫鼬更新记录数组中的嵌套对象
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 }
);
我目前遇到一个问题,我正在尝试更新 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 }
);