MongoDB全文search:溢出sorting阶段缓冲数据的使用

我正在尝试在我的节点(express.js)应用程序中实现mongo文本search。

这是我的代码:

Collection.find({$text: {$search: searchString}} , {score: {$meta: "textScore"}}) .sort({score: {$meta: 'textScore'}}) .exec(function(err, docs { //Process docs }); 

在大型数据集上执行文本search时出现以下错误:

MongoError:执行程序错误:溢出sorting阶段缓冲数据使用量33554558字节超过内部限制33554432字节

我知道,MongoDB可以sorting最大32MB的数据,这个错误可以通过添加索引字段来避免,我们将sorting收集。 但在我的情况下,我正在通过textScoresorting收集,我不确定是否有可能为此字段设置索引。 如果没有,是否有任何解决方法?

注:我知道有类似的问题,但大多数这些问题没有textScore作为sorting标准,因此我的问题是不同的。

您可以使用聚合来规避限制。

 Collection.aggregate([ { $match: { $text: { $search: searchString } } }, { $sort: { score: { $meta: "textScore" } } } ]) 

$sort阶段有100 MB的限制。 如果您需要更多,可以使用allowDiskUse ,这将在进行sorting时写入临时文件。 要做到这一点,只需添加allowDiskUse: true的聚合选项。

如果结果大于16MB(即MongoDB的文档大小限制),则需要请求一个游标来遍历数据。 在exec之前添加.cursor() ,这里有一个详细的例子。 http://mongoosejs.com/docs/api.html#aggregate_Aggregate-cursor