Mongodb Meteor 1.6 mongo find Unhandled PromiserEjectionWarning和limiting find on large collection

Mongodb Meteor 1.6 mongo find Unhandled PromiserEjectionWarning和limiting find on large collection,mongodb,meteor,es6-promise,unhandled-exception,Mongodb,Meteor,Es6 Promise,Unhandled Exception,我正在对一个大型集合(~1.000.000个文档)进行查询,以获取最新文档 我的功能很简单: Meteor.methods({ getLatest:function(){ 返回集合。find({},{limit:30,sort:{createdAt:-1}); }, }); 这导致了以下错误: (STDERR) (node:15450) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3)

我正在对一个大型集合(~1.000.000个文档)进行查询,以获取最新文档

我的功能很简单:

Meteor.methods({
getLatest:function(){
返回集合。find({},{limit:30,sort:{createdAt:-1});
},
});
这导致了以下错误:

(STDERR) (node:15450) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): RangeError: Maximum call stack size exceeded
(STDERR) (node:15450) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
我尝试了以下其他查询:

collection.find({},{limit:30,hint:{$natural:-1});
查找({},{limit:30});
这导致了同样的错误

在方法中记录
cursor.count()
时,我会得到集合的文档总量。这让我想到
限制是否有问题

仅调用查询并返回其他内容时,不会发生错误:

Meteor.methods({
getLatest:function(){
const cursor=collection.find({},{limit:30,sort:{createdAt:-1});
console.log(cursor.count());//~1.000.000
return[];//不触发未处理的PromisejectionWarning
},
});

在他们的项目页面上打开一个问题之前,我想知道是否有人也经历过这种情况或找到了解决方案。

那么你的
.catch()
在哪里,因为这里没有catch!而且你需要这些承诺,即使meteor有点隐藏它。可能的错误是“排序超出内存限制”当您实际尝试捕获错误并报告它时。解决方法是添加一个索引,您的集合可能会丢失该索引。常规块通常可用于大多数meteor方法。实际上,它是一个排序内存限制,“当无法从索引中获取排序顺序时,MongoDB将在内存中对结果进行排序,这要求排序的结果集小于32 MB“。在
createdAt
上添加索引他没有
try
块,因此他将
捕获放在哪里?
捕获必须从Meteor MongoDB代码中丢失。检查
createdAt
上是否有索引肯定是一个很好的技巧。添加
进程。on('unhandledRejection',r=>console.log(r));
到您的服务器入口点,它将给您一个堆栈跟踪,以帮助您确定它发生的位置。正确的数据是否仍在发送到客户端?@MichelFloyd
尝试{return collection.find({},{limit:30,sort:{createdAt:-1});}catch(e){console.log(e)}
基本上是我所说的重点。它对Meteor完全有效,事实上是推荐的。正如所述,随后可以捕获和报告的异常很可能是由于排序字段上没有索引,但将块放在那里至少会捕获实际错误并允许它被解决。如果您不是tr在代码中应用异常,那么你就做错了。那么你的
.catch()
在哪里呢?因为这里没有catch!而且你需要这些承诺,即使meteor有点隐藏它。可能的错误是“排序超出内存限制”当您实际尝试捕获错误并报告它时。解决方法是添加一个索引,您的集合可能会丢失该索引。常规块通常可用于大多数meteor方法。实际上,它是一个排序内存限制,“当无法从索引中获取排序顺序时,MongoDB将在内存中对结果进行排序,这要求排序的结果集小于32 MB“。在
createdAt
上添加索引他没有
try
块,因此他将
捕获放在哪里?
捕获必须从Meteor MongoDB代码中丢失。检查
createdAt
上是否有索引肯定是一个很好的技巧。添加
进程。on('unhandledRejection',r=>console.log(r));
到您的服务器入口点,它将给您一个堆栈跟踪,以帮助您确定它发生的位置。正确的数据是否仍在发送到客户端?@MichelFloyd
尝试{return collection.find({},{limit:30,sort:{createdAt:-1});}catch(e){console.log(e)}
基本上是我所说的重点。它对Meteor完全有效,事实上是推荐的。正如所述,随后可以捕获和报告的异常很可能是由于排序字段上没有索引,但将块放在那里至少会捕获实际错误并允许它被解决。如果您不是tr在代码中应用异常,那么您就做错了。