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收集。 但在我的情况下,我正在通过textScore
sorting收集,我不确定是否有可能为此字段设置索引。 如果没有,是否有任何解决方法?
注:我知道有类似的问题,但大多数这些问题没有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