【问题标题】:How to correctly iterate through a search result in MongoDB-Shell?如何正确遍历 MongoDB-Shell 中的搜索结果?
【发布时间】:2015-01-19 22:48:33
【问题描述】:

我有一个包含 500 个文档的 MongoDB 表:

db.x.find().count()

现在我想遍历所有条目。不幸的是,下面的代码只给出了49,而不是500

a=0; for (s in db.x.find()) { a++; }; print(a);

我已经将结果数量增加到1000

DBQuery.shellBatchSize = 1000

但这并没有帮助。

【问题讨论】:

  • 试试 db.x.find().forEach(function(item) {...})

标签: javascript mongodb iterator


【解决方案1】:

当您在 java 脚本中使用 for in 语句时,它会迭代 Objectenumerable 属性。

db.x.find() 返回一个cursor 对象。 Cursor 的一些enumerable 属性如下:

_mongo
_db
_collection
_ns
_query
_fields
_limit
_skip
_batchSize
_options
_cursor
_numReturned
_special help clone
_ensureSpecial
hasNext
map
forEach

总共有49 这样的Cursor 属性。这就是为什么无论您是迭代一个空集合还是具有超过 1000 条记录的集合,您总是得到 49。您正在迭代这些属性,而不是游标中的结果。

如果您注意到这些可枚举的属性,您会发现hasNextmapforEach 的作用相当于光标的properties。所以你需要利用这些属性来迭代游标。

iterate 光标中的结果:

var myCursor = db.x.find();

while (myCursor.hasNext()) {
   print(tojson(myCursor.next()));
}

或者,

db.x.find().forEach(function(i){

})

或者,

db.x.find().map(function(i){
...
})

第一种是首选且记录在案的方式。

【讨论】:

  • 为什么投反对票?评论以便改进答案。
  • 你的回答对我来说是完美的。我的问题也收到了 3 票没有评论的反对票,...
猜你喜欢
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多