我正在尝试在我的节点(express.js)应用程序中实现mongo文本搜索。
以下是我的代码:
Collection.find({$text: {$search: searchString}}
, {score: {$meta: "textScore"}})
.sort({score: {$meta: 'textScore'}})
.exec(function(err, docs {
//Process docs
});
在大型数据集上执行文本搜索时出现以下错误:
MongoError:执行程序错误:溢出排序阶段缓冲数据使用量33554558字节超出内部限制33554432字节
我知道MongoDB最多可以对32MB数据进行排序,并且可以通过为字段添加索引来避免此错误,我们将对其进行排序。但在我的情况下,我按textScore
排序集合,我不确定是否可以为此字段设置索引。如果没有,是否有任何解决方法?
注意:我知道在SO上也有类似的问题,但大多数问题没有textScore
作为排序标准,因此我的问题不同。
答案 0 :(得分:1)
您可以使用聚合来规避限制。
Collection.aggregate([
{ $match: { $text: { $search: searchString } } },
{ $sort: { score: { $meta: "textScore" } } }
])
$sort
阶段的限制为100 MB。如果您需要更多,可以使用allowDiskUse
,它将在排序时写入临时文件。要做到这一点,只需将allowDiskUse: true
添加到聚合选项。
如果您的结果大于16MB(即MongoDB的文档大小限制),您需要请求游标迭代您的数据。只需在您的执行官之前添加.cursor()
,这是一个详细的示例。 http://mongoosejs.com/docs/api.html#aggregate_Aggregate-cursor