MongoDB 全文搜索:溢出排序阶段缓冲数据使用

MongoDB fulltext search: Overflow sort stage buffered data usage

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

这是我的代码:

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

//Process docs
});

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

MongoError: Executor error: Overflow sort stage buffered data usage of 33554558 bytes exceeds internal limit of 33554432 bytes

我知道 MongoDB 最多可以对 32MB 的数据进行排序,并且可以通过为我们将用于排序集合的字段添加索引来避免此错误。但在我的例子中,我按 textScore 对集合进行排序,我不确定是否可以为此字段设置索引。如果没有,是否有任何解决方法?

注意: 我知道在 SO 上有类似的问题,但其中大多数问题没有 textScore 作为排序标准,因此我的问题是不同的。

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

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

$sort 阶段有 100 MB 的限制。如果您需要更多,可以使用 allowDiskUse,它会在排序时写入临时文件。为此,只需将 allowDiskUse: true 添加到聚合选项即可。

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