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

IT技术 javascript mongoose
2021-02-26 17:44:39

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

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

但是,这将生成对书籍的查找,收集标题、页面和导演的字段 - 还会生成对电影的查找,收集标题、页面和导演的字段。我想要的是仅从书籍中获取标题和页面,从电影中获取导演。我可以做这样的事情:

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

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

但是有没有什么办法让第二个片段的行为像第一个片段一样使用类似的“单行”语法?这样做的原因是,我想以编程方式确定 populate 函数的参数并将其输入。对于多个 populate 调用,我不能这样做。

4个回答

在查看 mongoose 的源代码后,我解决了这个问题:

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

Person.find({})
 .populate(populateQuery)
 .execPopulate()
@AkosK @Anshuman Pattnaik 只需删除.execPopulate()它即可正常工作
2021-05-02 17:44:39
execPopulate 不是函数,请帮忙
2021-05-17 17:44:39
这种用法对链接多个群体是否有任何性能影响?
2021-05-18 17:44:39
@scaryguy 是的,对性能有一些影响:/,但不幸的是,在某些情况下,我们被迫进行多个链接填充……如果您有任何建议,请告诉我们
2021-05-18 17:44:39
@GoncharDenys 不,它失败了 .populate(...).exec is not a function
2021-05-19 17:44:39

您还可以执行以下操作:

{path:'user',select:['key1','key2']}

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

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

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

这是基于 Mongoose JS 文档http://mongoosejs.com/docs/populate.html 的方法

假设您有一个 BookCollection 架构,其中包含用户和书籍为了执行查询并获取所有 BookCollection 及其相关用户和书籍,您可以这样做

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);
    }
他们想从这些路径中的每一个中选择某些数据。就像这本书的路径一样,他们只想填充标题和页面。这将为用户和书籍填充整个模型。
2021-04-24 17:44:39
看来问题的作者还是自己解决了。
2021-05-17 17:44:39