【问题标题】:how to use mongoose pagination with populate and query如何在填充和查询中使用猫鼬分页
【发布时间】:2018-02-19 05:33:02
【问题描述】:

我正在尝试使用猫鼬分页来处理带有分页的高级搜索。

我有以下架构:

const authorSchema = Schema({
  _id: Schema.Types.ObjectId,
  name: {type: String, unique: true},
});    
const Author = mongoose.model('author', authorSchema, 'author');

const bookSchema = Schema({
_id: Schema.Types.ObjectId,
name: String,
authors:[{type: Schema.Types.ObjectId, ref: 'author'}]
});
const Book= mongoose.model('book', bookSchema , 'book');

我想查找第 1 页的 24 本书,其中任何一本书都包含作者姓名“jean”。我使用mongoose-paginate 模块执行以下操作:

 Book.paginate({}, {
    page: 1,
    limit: 24,
    populate: {
     path: 'authors',
     select: 'name',
     match: {
        name: 'jean'
     }
    }, function (err, books) {
        res.json(books);
    });

但结果书包含其他作者数组为空的书。我不能使用 books.filter() 来删除作者的书。但如果我这样做,我不能在结果中每页有 24 本书。

这样做的正确方法是什么?

【问题讨论】:

标签: node.js mongodb mongoose pagination


【解决方案1】:

我建议在聚合查询中使用$lookup,而不是填充。

db.book.aggregate(
{$unwind:'$authors'},
{$lookup:{
    from: 'author',
    localField: 'authors',
    foreignField: '_id',
    as: 'authors'
    }},
    {$unwind: '$authors'},
    {$match: {'authors.name':'Jean'}},
    {$group: {_id: '$_id', authors: {$push: '$authors'}}},
    {$limit: 24}
)

populate$lookup 支持之前的旧解决方案,我们应该努力使用最新的数据库功能。

【讨论】:

  • 这里不使用mongoose-paginate模块,能不能用模块显示答案。
  • 不理解反对票。用户需要弄清楚他们是否想要解决不需要任何库或想要使用特定库的问题
猜你喜欢
  • 1970-01-01
  • 2018-06-15
  • 2021-04-19
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 2023-03-21
  • 2019-11-11
相关资源
最近更新 更多