Mongoose:在一次调用中填充多个查询

时间:2014-01-12 00:37:04

标签: javascript mongoose

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

Person.find({})
 .populate('books movie', 'title pages director')
 .exec()

然而,这会产生一个关于收集标题,页面和导演字段的书籍的查找 - 以及收集标题,页面和导演领域的电影的查找。我想要的只是从书本中获取标题和页面,从电影中获取导演。我可以这样做:

Person.find({})
 .populate('books', 'title pages')
 .populate('movie', 'director')
 .exec()

给了我预期的结果和查询。

但是有没有办法让第二个片段的行为使用类似第一个片段的“单行”语法?原因是,我想以编程方式确定populate函数的参数并将其输入。我不能为多个填充调用执行此操作。

4 个答案:

答案 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对象,并使代码执行快一点!不要忘记使您的函数(回调)异步!