Javascript Mongoose:在单个调用中填充多个查询
在Mongoose中,我可以使用查询填充来填充查询后的其他字段。我还可以填充多个路径,例如Javascript Mongoose:在单个调用中填充多个查询,javascript,mongoose,Javascript,Mongoose,在Mongoose中,我可以使用查询填充来填充查询后的其他字段。我还可以填充多个路径,例如 Person.find({}) .populate('books movie', 'title pages director') .exec() 然而,这将在书籍上生成一个查找,收集标题、页面和导演的字段;在电影上生成一个查找,收集标题、页面和导演的字段。我只想从书中得到标题和页数,从电影中得到导演。我可以这样做: Person.find({}) .populate('books', 'title
Person.find({})
.populate('books movie', 'title pages director')
.exec()
然而,这将在书籍上生成一个查找,收集标题、页面和导演的字段;在电影上生成一个查找,收集标题、页面和导演的字段。我只想从书中得到标题和页数,从电影中得到导演。我可以这样做:
Person.find({})
.populate('books', 'title pages')
.populate('movie', 'director')
.exec()
这给了我预期的结果和查询
但是,有没有办法让第二个代码段的行为使用与第一个代码段类似的“单行”语法?这样做的原因是,我希望以编程方式确定populate函数的参数并将其输入。我无法对多个填充调用执行此操作。在查看mongoose的源代码后,我用以下方法解决了此问题:
var populateQuery = [{path:'books', select:'title pages'}, {path:'movie', select:'director'}];
Person.find({})
.populate(populateQuery)
.execPopulate()
您还可以执行以下操作:
{path:'user',select:['key1','key2']}
这就是基于Mongoose JS文档的实现方式 假设您有一个包含用户和书籍的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);
}
只需将对象或对象数组传递给populate()方法即可实现这一点
考虑到lean()方法是可选的,它只返回原始json而不是mongoose对象,并使代码执行速度加快一点!别忘了让你的函数(回调)异步 这种用法对链接多个填充是否有任何性能影响?@GoncharDenys否,它在
.populate(…)中失败。exec不是函数
execPopulate不是函数,请help@AkosK@Anshuman Pattnaik只需删除.execPopulate()
它会工作的properly@scaryguy是的,对性能有一些影响:/,但不幸的是,在某些情况下,我们被迫使用多个链接填充。。。如果您有任何建议,请告知我们他们希望从这些路径中选择某些数据。就像书的路径一样,他们只想填充标题和页面。这将为用户和书籍填充整个模型。似乎问题的作者自己解决了它。
const query = [
{
path:'books',
select:'title pages'
},
{
path:'movie',
select:'director'
}
];
const result = await Person.find().populate(query).lean();