KeystoneJS 和 Mongoose,关于通过 API 返回相关文档的建议

KeystoneJS and Mongoose, advice on returning related documents via API

我有两个由 KeystoneJS 定义的 Mongoose 模型:

// models/Movie.js

var Movie = new keystone.List('Movie');
Movie.add({
title: {
    type: Types.Text,
    initial: true,
    required: true,
    index: true,
    unique: true
}).relationship({
    path: 'trailers',
    ref: 'Trailer',
    refPath: 'movie'
});

// models/Trailer.js

var Trailer = new keystone.List('Trailer');

Trailer.add('Trailer', {
  title: {
    type: Types.Text,
    required: true,
    initial: true,
  }
}, 'Movie', {
    movie: {
        type: Types.Relationship,
        ref: 'Movie',
        many: false,
    }
})

电影预告片之间存在一对多关系。

我为电影写了一篇API:

function findByTitle(req, res) {

    var promise = Movie.model.findOne({
        title: {
            $regex: new RegExp('^' + req.query.title + '$', "i")
        }
    })
    .exec();

    promise.then(function (item) {

        item.populateRelated('trailers', function (err, trailers) {
            item.trailers = trailers;
            res.status(200).send(item);
        })
    })
    .catch(function (err) {
        res.status(500).send(err.name);
    })
}

目前我正在利用 KeystoneJS 的 populateRelated 方法,这会按预期抓取相关的预告片。但由于 Mongoose 模式是不可变的,您应该如何 return 响应中的相关预告片?我知道您可以将 strict: false 作为架构选项传递,但我认为以这种方式覆盖架构行为是不安全的。

感觉我在与框架作斗争,因此可能以错误的方式解决了这个问题。通过 API returning 相关字段数据的首选方法是什么?

更新:

一个单独的 API 端点是否是最好的方式,例如:

api/movies/<movie_id>/trailers

尝试像这样使用 填充

function findByTitle(req, res) {

  Movie.model.findOne({
    title: {
      $regex: new RegExp('^' + req.query.title + '$', "i")
    }
  })
  .populate('trailers')
  .exec()
  .then(function (item) {
    res.status(200).send(item)
  })
  .catch(function (err) {
    res.status(500).send(err.name)
  })

}