MongoDB Node.js每个方法

MongoDB Node.js每个方法,node.js,mongodb,limit,each,Node.js,Mongodb,Limit,Each,我有一个数据数组,我将存储在数据库中。当我查看数据是否已经存在时,each()将被调用两次,即使在使用limit(1)时也是如此。我不知道这里发生了什么 collection.find({ month: 'april' }).limit(1).count(function(err, result){ console.log('counter', result); }); collection.find({ month: 'april' }).limit(1).each(

我有一个数据数组,我将存储在数据库中。当我查看数据是否已经存在时,each()将被调用两次,即使在使用limit(1)时也是如此。我不知道这里发生了什么

collection.find({
    month: 'april'
}).limit(1).count(function(err, result){
    console.log('counter', result);
});

collection.find({
    month: 'april'
}).limit(1).each(function(err, result){
    console.log('each', result);
});

collection.find({
    month: 'april'
}).limit(1).toArray(function(err, result){
    console.log('toArray', result);
});
此时,集合中已存储了确切的1个4月份数据集。 上述查询将生成如下输出:

count 1
each {...}
each null
toArray {...}

在mongo shell中,我检查了count()和forEach()方法。一切正常。这是司机的问题吗?我做错什么了吗?

这是预期的行为。驱动程序返回循环中的项目,然后在结束时返回
null
,表示没有剩余的项目。您也可以在驾驶员侧看到这一点:

如果您对详细信息感兴趣,您可以检查每个:

if(this.items.length > 0) {
  // Trampoline all the entries
  while(fn = loop(self, callback)) fn(self, callback);
  // Call each again
  self.each(callback);
} else {
  self.nextObject(function(err, item) {

    if(err) {
      self.state = Cursor.CLOSED;
      return callback(utils.toError(err), item);
    }

>>  if(item == null) return callback(null, null);  <<
    callback(null, item);
    self.each(callback);
  })
}
if(this.items.length>0){
//所有参赛作品都要蹦床
而(fn=loop(self,callback))fn(self,callback);
//再打一次
self.each(回调);
}否则{
self.nextObject(函数(错误,项){
如果(错误){
self.state=Cursor.CLOSED;
返回回调(utils.toError(err),项);
}

>>if(item==null)返回回调(null,null);您能否
console.log
每次迭代中的
err
变量只是为了查看第二次通过的是什么?但是,当this.items.length==0时,为什么需要检查nextObject?这应该暗示item==null,不是吗?扩展了我的答案。只有当结果包含大量文档时才有意义。以防万一关于
limit(1)
很容易看出没有更多的项了。但是
每个
都必须是一致的,这就是为什么它总是在最后一项之后返回
null
。好的,我现在明白了,谢谢。我想each()不是检查文档是否已经存在的正确函数,对吗?这就是为什么findOne()的原因存在?在检查null的情况下,我将得到错误的结果,因为如果该集合中还没有匹配的文档,它将返回null;如果文档存在并且集合已结束,它将返回null。
each()
用于迭代
find()返回的项
。当您希望查询返回更多文档时,它非常有用。如果您只想检查文档是否存在,那么使用
findOne()
是最简单的方法。如果项目不存在,它将返回
null
。您可以使用如下代码:
collection.findOne({},function(err,item){If(!err&&item!=null){//exists}}
if(this.items.length > 0) {
  // Trampoline all the entries
  while(fn = loop(self, callback)) fn(self, callback);
  // Call each again
  self.each(callback);
} else {
  self.nextObject(function(err, item) {

    if(err) {
      self.state = Cursor.CLOSED;
      return callback(utils.toError(err), item);
    }

>>  if(item == null) return callback(null, null);  <<
    callback(null, item);
    self.each(callback);
  })
}