Node.js MongoDB驱动程序游标未正确计数。

4

我使用MongoDB Node.js原生驱动程序版本2.2.29遇到了问题。

这是我正在运行的代码:

let cursor = db.collection( 'log' )
               .find({timestamp: { '$lte': 1498556839 }})
               .sort( { create_date_ttl: -1 } )
               .limit( 3 );

如果我现在运行cursor.count()并处理Promise,我发现计数给了我56个记录,而不是3个(指定的限制)。
cursor.count().then( (count) => {
   // count here is 56
});

然而,如果我使用回调函数运行cursor.count( function (err, count) {}),则只有3条记录的计数是正确的。
cursor.count( function (err, count) {
  // count here is 3 according to the limit specified.
});

有人遇到同样的问题吗?或者有人可以解释一下这是怎么可能的吗?也许我漏掉了什么,但根据官方文档documentation,似乎没问题。

提前感谢。


更有趣的是使用 Promise 进行普通查询的结果,而不是应用计数。所有文档都会返回吗?这将意味着在返回的 Promise 中未应用 .sort().limit() 修饰符的 bug。 - Neil Lunn
是的。阅读文档。http://mongodb.github.io/node-mongodb-native/2.2/api/Cursor.html#count。实际上,签名表示您需要在此上下文中设置第一个参数。 - Neil Lunn
1个回答

8

将第一个参数( applySkipLimit )明确设置为true,然后 skiplimit 将被应用。

cursor.count(true).then( (count) => {
   // count here will be 3
});

看起来文档不够清晰,因为文档中写道true应该是默认值。正如评论中提到的那样,这是回调函数的行为。


1
实际上,文档非常准确,并告诉你要这样做。第一个选项是applySkipLimit链接如上所示。但是,是的,这是正确的。我想“澄清”是指“默认带有回调函数”,而这并不是文档所说的。 - Neil Lunn
感谢Neil的澄清,是的,我认为文档中表述不够清晰。 - Moisés Belchín

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接