如何正确遍历 MongoDB-Shell 中的搜索结果?

R_U*_*ser 1 javascript iterator mongodb

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

db.x.find().count()
Run Code Online (Sandbox Code Playgroud)

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

a=0; for (s in db.x.find()) { a++; }; print(a);
Run Code Online (Sandbox Code Playgroud)

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

DBQuery.shellBatchSize = 1000
Run Code Online (Sandbox Code Playgroud)

但这并没有帮助。

Bat*_*eam 5

当您使用声明Java脚本,它可以迭代enumerable的特性Object

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

_mongo
_db
_collection
_ns
_query
_fields
_limit
_skip
_batchSize
_options
_cursor
_numReturned
_special help clone
_ensureSpecial
hasNext
map
forEach
Run Code Online (Sandbox Code Playgroud)

总共有 a 的49这样的属性Cursor。这就是为什么无论迭代空集合还是包含 1000 多条记录的集合,结果总是得到 49 的原因。您正在迭代这些属性,而不是游标中的结果。

如果您注意到这些可枚举的属性,您可以在光标处找到hasNext, map,forEach函数properties。所以你需要利用这些属性来迭代游标。

要在 Cursor 中迭代结果:

var myCursor = db.x.find();

while (myCursor.hasNext()) {
   print(tojson(myCursor.next()));
}
Run Code Online (Sandbox Code Playgroud)

或者,

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

})
Run Code Online (Sandbox Code Playgroud)

或者,

db.x.find().map(function(i){
...
})
Run Code Online (Sandbox Code Playgroud)

第一个是首选和记录的方式。

  • 为什么投反对票?评论以便可以改进答案。 (2认同)