如何在 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 开始,
$arrayElemAt
从 editedLyrics
数组中获取 updatedLyric
的第一个值并将其更新为 officialLyric
db.collection.updateMany(
{}, // put your query
[{
$set: {
officialLyric: {
$arrayElemAt: ["$editedLyrics.updatedLyric", 0]
}
}
}]
)
如何用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 开始,
$arrayElemAt
从editedLyrics
数组中获取updatedLyric
的第一个值并将其更新为officialLyric
db.collection.updateMany(
{}, // put your query
[{
$set: {
officialLyric: {
$arrayElemAt: ["$editedLyrics.updatedLyric", 0]
}
}
}]
)