MongoDB 2.6生产版文本搜索-如何使用Skip进行分页



在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的旧方法。这基本上就是limitskip等修饰符的应用方式。

但请记住,在撰写本文时,当前的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中引入。

因此,更改skiplimit的值,就可以使用光标对文本搜索结果进行分页。只需小心大数据返回,因为skiplimit并不是移动光标的有效方法。最好有另一个可以进行范围匹配的键,即使这与"相关性匹配"相反。

因此,文本搜索设施有点"更好",但并不"完美"。和往常一样,如果您确实需要更多和/或更高的性能,请寻求外部解决方案。

也可以在.find()的Mongoose实现中尝试类似的操作。但我对过去的经验有所保留,即通常会进行一些屏蔽和检查,因此对"本地"节点驱动程序的使用进行了描述。

最新更新