首页 > 解决方案 > 猫鼬查找和更新删除其他字段

问题描述

我有这样的架构:

this.schema = new Schema({
    userEmail: String
    environments: [
        {
            envId: String,
            appPreference: String,
            language: String,
            timeZone: String,
            summaryNotificationSchedule: {
                timeOfTheDay: String
            }
        }
    ]
});

更新请求:

{
  "envId": "u2",
  "appPreference": "put2",
  "timeZone": "gmt",
  "summaryNotificationSchedule.timeOfTheDay": "32400",
}

如您所见,我没有发送 "language": "abc",更新请求,结果我看到该language字段已被删除。我想更新字段但不删除其他字段

Mongoose 查找和更新调用:

await this.model.findOneAndUpdate({ userEmail, 'environments.envId': envId }, { $set: { 'environments.$': setPreferenceFields } }, { new: true });

标签: mongodbmongoose

解决方案


您可以先从您的请求创建更新对象:

let request = {
  "envId": "u2",
  "appPreference": "put2",
  "timeZone": "gmt",
  "summaryNotificationSchedule.timeOfTheDay": "32400",
};

let update = Object.keys(request).reduce((acc, cur) => {
  acc[`environments.$.${cur}`] = request[cur];
  return acc;
}, {})

console.log(update);

然后将其传递给更新:

await this.model.findOneAndUpdate({ userEmail, 'environments.envId': envId }, { $set: update }, { new: true });

推荐阅读