我觉得以前必须要问这个,但我似乎无法找到答案。我有以下Mongoose模型:
相册模型
const AlbumSchema = new Schema({
name: {
type: String,
required: true,
trim: true
},
user: {
type: ObjectId,
ref: 'User',
required: false
},
photosCount: {
type: Number,
default: 0
},
videosCount: {
type: Number,
default: 0
}
})
媒体模型
const MediaSchema = new Schema({
type: {
type: String,
enum: ['image', 'video'],
required: true
},
user: {
type: ObjectId,
ref: 'User',
required: false
},
url: {
type: String,
required: true,
trim: true
},
width: {
type: Number,
required: true
},
height: {
type: Number,
required: true
},
albums: [{
type: ObjectId,
ref: 'Album'
}]
})
每当提取一个专辑时,我希望专辑中有一个thumbnail
属性,其中包含最近添加的media
对象。
我不想在相册模型上添加一组指向媒体的指针,因为相册可能有数万种媒体。对我来说,媒体应该保留对其所在专辑的引用,而不是反过来。
来自Mongoose的文档说:
值得商榷的是,我们确实需要两组指针 不同步。相反,我们可以跳过填充并直接找到() 我们感兴趣的故事。
Story
.find({ _creator: aaron._id })
.exec(function (err, stories) {
if (err) return handleError(err);
console.log('The stories are an array: ', stories);
})
不完全确定如何在这个特定的环境中应用它,或者它是否有意义。我觉得在模型中会有点难看,但我一般都是Mongoose和MongoDb的新手,所以我不确定最佳做法是如何处理这样的场景。
重申一点,我想要一种方法来获取任意相册的最新媒体,如果可以避免,我不想在两个集合中存储引用(出于我上面概述的原因)。我希望添加到给定相册中的最近添加的媒体对象位于该专辑的thumbnail
属性中,天气是单个专辑或一系列专辑。
更新
我考虑将其添加到AlbumSchema:
thumbnail: {
type: ObjectId,
ref: 'Media'
}
然后使用我的媒体模型中的帖子保存挂钩进行更新:
MediaSchema.post('save', function (media, next) {
if (!media.isNew || !media.album) {
return next()
}
const Album = mongoose.model('Album')
Album.update({ _id: media.album }, { thumbnail: media }, next)
})
这看起来很丑陋,如果此媒体后来被删除,系统必须找到所有相册,其缩略图指向该媒体并更新它们以指向下一个最近的媒体。