首页 > 解决方案 > 如何在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 },

有关问题的清晰描述,请参见图像。

在此处输入图像描述

标签: node.jsmongodbmongooseschemabackend

解决方案


如果您希望始终必须在 officialLyric 中的editedLyric 数组中获取最新 updateLyric 的值,则不需要将 officialLyric 实际存储在 DB 中。您可以使用 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();
});

推荐阅读