如何在 mongodb 中用另一个模式覆盖模式的一个字段

How to overwrite one field of a schema with another in mongodb

如何用updateLyric的值覆盖officialLyric的值??

artist: { type: String, required: true },
title: { type: String, required: true },
officialLyric: { type: String, required: true },
editedLyrics: [
  {
    updatedLyric: String,
    status: {
      type: String,
      enum: ["Aproved", "Rejected", "Pending"],
      default: "Pending",
    },
    userId: { type: Schema.Types.ObjectId, required: true, ref: "User" },
  },
],
releaseDate: { type: Date },

请参阅图片以清楚地描述问题。

enter image description here

如果你想在 officialLyric 的 editedLyric 数组中总是有最新的 updateLyric 值,你不需要实际将 officialLyric 存储在数据库中。您可以使用 mongoose 虚拟字段并从架构中删除 officialLyric。

LyricSchema.virtual('officialLyric').get(function () { 
    if(!this.editedLyrics.length) return null;
    return this.editedLyrics[this.editedLyrics.length-1].updatedLyric;
});

如果您仍然想先存储官方歌词,然后用您保存的编辑版本覆盖它。你可以使用钩子。

LyricSchema.post('save', async(error, doc, next) => {
    if(doc.editedLyrics.length && doc.officialLyric != doc.editedLyrics[doc.editedLyrics.length-1].updatedLyric){
        doc.officialLyric = doc.editedLyrics[doc.editedLyrics.length-1].updatedLyric;
        await doc.save();
    }
    next();
});

您可以尝试 update with aggregation pipeline 从 MongoDB 4.2 开始,

  • $arrayElemAteditedLyrics 数组中获取 updatedLyric 的第一个值并将其更新为 officialLyric
db.collection.updateMany(
  {}, // put your query
  [{
    $set: {
      officialLyric: {
        $arrayElemAt: ["$editedLyrics.updatedLyric", 0]
      }
    }
  }]
)

Playground