使用 mongoose 全文搜索和 KeystoneJS 分页
Posted
技术标签:
【中文标题】使用 mongoose 全文搜索和 KeystoneJS 分页【英文标题】:Using mongoose full text search with KeystoneJS paginate 【发布时间】: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' 是你的列表的名称。
我有。我编辑了原始帖子,并在执行此操作时收到错误 + 我的代码。
你在哪里使用回调?
【参考方案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.
【讨论】:
以上是关于使用 mongoose 全文搜索和 KeystoneJS 分页的主要内容,如果未能解决你的问题,请参考以下文章