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

lnlaulya  于 2023-01-08  发布在  Java
关注(0)|答案(5)|浏览(96)

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

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

然而,这将生成一个查找图书收集的字段为标题,页和导演-也查找电影收集的字段为标题,页和导演以及.我想要的是得到标题和页从图书只,导演从电影.我可以这样做:

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

它给出了预期的结果和查询。
但是有没有办法让第二个代码段的行为使用类似于第一个代码段的“单行”语法呢?这样做的原因是,我想通过编程来确定populate函数的参数并将其输入。我不能为多个populate调用这样做。

vzgqcmou

vzgqcmou1#

//架构必须包含路径

let createdData =Person.create(dataYouWant)

await createdData.populate([{path:'books', select:'title pages'},{path:'movie', select:'director'}])
mlmc2os5

mlmc2os52#

在研究了mongoose的源代码之后,我用以下方法解决了这个问题:

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

Person.find({})
 .populate(populateQuery)
 .execPopulate()
f1tvaqid

f1tvaqid3#

你也可以做一些如下:

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

tzdcorbm4#

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

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

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

yruzcnhs

yruzcnhs5#

这是基于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);
    }

相关问题