如何使用popong和查询进行mongoose分页

时间:2017-09-11 03:38:38

标签: node.js mongodb mongoose pagination

我尝试使用mongoose分页来处理分页预先搜索。

我有以下架构:

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本书。

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

1 个答案:

答案 0 :(得分:0)

我建议在聚合查询中使用$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}
)