Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose:在单个调用中填充多个查询_Javascript_Mongoose - Fatal编程技术网

Javascript Mongoose:在单个调用中填充多个查询

Javascript Mongoose:在单个调用中填充多个查询,javascript,mongoose,Javascript,Mongoose,在Mongoose中,我可以使用查询填充来填充查询后的其他字段。我还可以填充多个路径,例如 Person.find({}) .populate('books movie', 'title pages director') .exec() 然而,这将在书籍上生成一个查找,收集标题、页面和导演的字段;在电影上生成一个查找,收集标题、页面和导演的字段。我只想从书中得到标题和页数,从电影中得到导演。我可以这样做: Person.find({}) .populate('books', 'title

在Mongoose中,我可以使用查询填充来填充查询后的其他字段。我还可以填充多个路径,例如

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();