Mongoose从另一个集合中的引用填充

时间:2016-04-08 17:05:09

标签: node.js mongodb mongoose

我觉得以前必须要问这个,但我似乎无法找到答案。我有以下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)
})

这看起来很丑陋,如果此媒体后来被删除,系统必须找到所有相册,其缩略图指向该媒体并更新它们以指向下一个最近的媒体。

0 个答案:

没有答案