我有两个由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模式是不可变的,您应该如何在响应中返回相关的预告片?我知道您可以将strict: false
作为架构选项传递,但我觉得以这种方式覆盖架构行为是不安全的。
感觉我正在对框架进行一些打击,因此可能以错误的方式解决这个问题。通过API返回相关字段数据的首选方法是什么?
更新
单独的API端点是否是最佳方式,例如:
api/movies/<movie_id>/trailers
答案 0 :(得分:0)
尝试使用填充,如下所示:
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)
})
}