【问题标题】:Using mongoose full text search with KeystoneJS paginate使用 mongoose 全文搜索和 KeystoneJS 分页
【发布时间】:2018-02-14 00:32:48
【问题描述】:

我有来自 Keystone 模型的全文搜索返回结果。问题是我使用model.find() 生成这些结果。我想对这些结果进行分页,但我找不到将$text.paginate() 一起使用的方法。有没有办法将猫鼬全文搜索与 Keystone 分页相结合,甚至对来自model.find() 的结果进行分页?

编辑

我已经厌倦了使用keystone.list('List').paginate().find(),但我收到一个错误:“回调不是函数。”也许我的代码还有其他问题:

keystone.list('Document').paginate({
  page: req.query.page || 1,
  perPage: 10,
  maxPages: 6,
})
.find(
  { $text : { $search : req.query.search } },
  { score : { $meta: "textScore" } }
)
.sort({ score : { $meta : 'textScore' } })
.exec(function(err, results) {
  locals.documents = results;
  next();
});

【问题讨论】:

  • 你试过model.paginate().find()吗?
  • 我尝试了 model.paginate().find(),但由于 paginate() 不是 model 的函数,所以会报错。我也尝试过 paginate().model.find(),它的作用与我简单地调用 model.find() 相同。
  • 试试这个:keystone.list('MyList').paginate().find() - 'MyList' 是你的列表的名称。
  • 我有。我编辑了原始帖子,并在执行此操作时收到错误 + 我的代码。
  • 你在哪里使用回调

标签: mongoose pagination keystonejs


【解决方案1】:

这就是我设法进行过滤的方式。 Keystone boilerplate。下面是我的待办事项模型

import keystone from 'keystone';

const { Field: { Types } } = keystone;

const Todo = new keystone.List('Todo');

Todo.add({
   title: {
   type: String, required: true, default: Date.now,
 },
 description: { type: Types.Html, wysiwyg: true },
 createdAt: { type: Date, default: Date.now },
});

Todo.relationship({ path: 'users', ref: 'User', refPath: 'todos' });
Todo.schema.index({ title: 'text' });
Todo.register();

export default Todo;

和分页过滤器

export const list = (req, res) => {
const search = new RegExp(req.query.search || '', 'i');
const query = {
  title: search,
};
Todo.paginate({
   page: req.query.page || 1,
   perPage: 5,
   maxPages: 10,
   filters: {
     $or: [query],
   },
 }).sort('-createdAt').exec((err, items) => {
 if (err) return res.status(500).json(err);

   return res.json({
     data: items,
   });
 });
};

【讨论】:

    【解决方案2】:

    您可以使用这样的过滤器:

    keystone.list('Document').paginate({
        page: req.query.page || 1,
        perPage: 10,
        maxPages: 6,
        filters: {
            $text: {
                $search: req.query.search || ''
            },
        },
        optionalExpression: {
            score: {$meta: "textScore"}
        },
    })
    .sort({ score : { $meta : 'textScore' } })
    .exec(function(err, results) {
        locals.documents = results;
        next();
    });
    

    paginate 函数会将其传递给find 函数。 See here.

    【讨论】:

      猜你喜欢
      • 2014-11-13
      • 1970-01-01
      • 2018-11-23
      • 2017-04-09
      • 2017-04-09
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多