在Mongoose中,我可以使用查询填充来在查询后填充其他字段。我也可以填充多个路径,例如
Person.find({})
.populate('books movie', 'title pages director')
.exec()
然而,这会产生一个关于收集标题,页面和导演字段的书籍的查找 - 以及收集标题,页面和导演领域的电影的查找。我想要的只是从书本中获取标题和页面,从电影中获取导演。我可以这样做:
Person.find({})
.populate('books', 'title pages')
.populate('movie', 'director')
.exec()
给了我预期的结果和查询。
但是有没有办法让第二个片段的行为使用类似第一个片段的“单行”语法?原因是,我想以编程方式确定populate函数的参数并将其输入。我不能为多个填充调用执行此操作。
答案 0 :(得分:117)
在查看了猫鼬的源代码后,我用以下方法解决了这个问题:
var populateQuery = [{path:'books', select:'title pages'}, {path:'movie', select:'director'}];
Person.find({})
.populate(populateQuery)
.execPopulate()
答案 1 :(得分:4)
您也可以执行以下操作:
{path:'user',select:['key1','key2']}
答案 2 :(得分:2)
这是基于Mongoose JS文档http://mongoosejs.com/docs/populate.html
完成的假设您有一个包含用户和书籍的BookCollection架构 为了执行查询并获取所有BookCollections及其相关用户和书籍,您可以执行此操作
models.BookCollection
.find({})
.populate('user')
.populate('books')
.lean()
.exec(function (err, bookcollection) {
if (err) return console.error(err);
try {
mongoose.connection.close();
res.render('viewbookcollection', { content: bookcollection});
} catch (e) {
console.log("errror getting bookcollection"+e);
}
答案 3 :(得分:1)
您只需将对象或对象数组传递给populate()方法即可实现。
const query = [
{
path:'books',
select:'title pages'
},
{
path:'movie',
select:'director'
}
];
const result = await Person.find().populate(query).lean();
考虑到lean()方法是可选的,它只返回原始json而不是mongoose对象,并使代码执行快一点!不要忘记使您的函数(回调)异步!