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

Se7*_*ays 61 javascript mongoose

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

Person.find({})
 .populate('books movie', 'title pages director')
 .exec()
Run Code Online (Sandbox Code Playgroud)

然而,这将在书籍上产生查询,收集标题,页面和导演的字段 - 以及查看收集标题,页面和导演字段的电影.我想要的只是从书本中获取标题和页面,从电影中获取导演.我可以这样做:

Person.find({})
 .populate('books', 'title pages')
 .populate('movie', 'director')
 .exec()
Run Code Online (Sandbox Code Playgroud)

这给了我预期的结果和查询.

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

Se7*_*ays 129

在查看猫鼬的源代码后,我用以下方法解决了这个问题:

var populateQuery = [{path:'books', select:'title pages'}, {path:'movie', select:'director'}];

Person.find({})
 .populate(populateQuery)
 .execPopulate()
Run Code Online (Sandbox Code Playgroud)


Kar*_*sia 5

您还可以执行以下操作:

{path:'user',select:['key1','key2']}
Run Code Online (Sandbox Code Playgroud)


Rus*_*aev 5

您只需将对象或对象数组传递给 populate() 方法即可实现此目的。

const query = [
    {
        path:'books', 
        select:'title pages'
    }, 
    {
        path:'movie', 
        select:'director'
    }
];
const result = await Person.find().populate(query).lean();
Run Code Online (Sandbox Code Playgroud)

考虑到lean()方法是可选的,它只返回原始json而不是mongoose对象,并使代码执行速度更快一些!不要忘记使您的函数(回调)异步!