微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

node.js – 避免聚合16MB限制

我有大约1M文档的集合.每个文档都有internalNumber属性,我需要在node.js代码获取所有internalNumbers.

以前我用过

db.docs.distinct("internalNumber")

要么

collection.distinct('internalNumber',{},(err,result) => { /* ... */ })

在节点中.

但随着收藏的增长,我开始得到错误:明显太大了,16米帽.

现在我想使用聚合.它消耗大量内存并且速度很慢,但是没关系,因为我只需要在脚本启动时执行一次.我在Robo 3T GUI工具中尝试过:

db.docs.aggregate([{$group: {_id: '$internalNumber'} }]);

它工作,我想在node.js代码中使用它以下方式:

collection.aggregate([{$group: {_id: '$internalNumber'} }],docs) => { /* ... * });

但在Node I中出现错误:“MongoError:聚合结果超出了Function.MongoError.create的最大文档大小(16MB)”.

请帮助克服这个限制.

解决方法

问题是本机驱动程序与认情况下shell方法的工作方式不同,因为“shell”实际上返回了一个“游标”对象,其中本机驱动程序“明确地”需要此选项.

没有“游标”,.aggregate()将单个BSON文档作为文档数组返回,因此我们将其转换为游标以避免限制:

let cursor = collection.aggregate(
  [{ "$group": { "_id": "$internalNumber" } }],{ "cursor": { "batchSize": 500 } }
);

cursor.toArray((err,docs) => {
   // work with resuls
});

然后,您可以使用常规方法(如.toArray())将结果设置为“客户端”不具有相同限制的JavaScript数组,或其他用于迭代“cursor”方法.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐