在MongoDB 2.6中,文本搜索应该已经准备好生产了,我们现在可以使用skip
了。我想在我的中使用文本搜索和跳过分页,但我还不确定如何实现它
现在,我正在使用Mongoose和Mongoose文本搜索插件,但我不相信它们在MongoDB的文本搜索中都支持skip
,所以我想我需要使用原生的MongoClient。。。
我的应用程序通过Mongoose连接到数据库,使用:
//Bootstrap db connection
var db = mongoose.connect(config.db, function(e) {
现在,我如何使用本机MongoClient
来使用skip
参数对我的Products模型执行全文搜索。以下是我使用Mongoose和Mongoose文本搜索的内容,但无法在skip
:中添加
Product = mongoose.model('Product')
var query = req.query.query;
var skip = req.query.skip;
var options = {
project: '-created', // do not include the `created` property
filter: filter, // casts queries based on schema
limit: 20,
language: 'english',
lean: true
};
Product.textSearch(query, options, function (err, response) {
});
MongoDB 2.6版本中引入的主要区别在于,您可以使用标准.find()
接口发出"文本搜索"查询,因此不再需要应用textSearch
的旧方法。这基本上就是limit
和skip
等修饰符的应用方式。
但请记住,在撰写本文时,当前的Mongoose依赖关系是针对MongoDB 2.6发布之前存在的MongoDB节点驱动程序的早期版本。由于Mongoose实际上封装了主要方法,并自己进行了一些语法检查,因此使用Mongoose方法目前很可能会失败(正如我未尝试的那样)。
因此,您需要获得.find()
的底层驱动程序方法,现在也可以使用$text
运算符:
Product.collection.find(
{ "$text": { "$search": "term" } },
{ "sort": { "score": { "$meta": "textScore" } }, "skip": 25, "limit": 25 },
function(err,docs) {
// processing here
});
还需要注意的是,$text
运算符默认情况下不会根据相关性的"分数"对结果进行排序,但这是使用新的$meta
操作符传递给"排序"选项的,该操作符也在MongoDB 2.6中引入。
因此,更改skip
和limit
的值,就可以使用光标对文本搜索结果进行分页。只需小心大数据返回,因为skip
和limit
并不是移动大光标的有效方法。最好有另一个可以进行范围匹配的键,即使这与"相关性匹配"相反。
因此,文本搜索设施有点"更好",但并不"完美"。和往常一样,如果您确实需要更多和/或更高的性能,请寻求外部解决方案。
也可以在.find()
的Mongoose实现中尝试类似的操作。但我对过去的经验有所保留,即通常会进行一些屏蔽和检查,因此对"本地"节点驱动程序的使用进行了描述。