如何在 MongoDB-Shell 中正确迭代搜索结果?

问题描述 投票:0回答:2

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

db.x.find().count()

现在我想迭代所有条目。不幸的是,下面的代码只给出了

49
,而不是
500
:

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

我已经将结果数量增加到

1000

DBQuery.shellBatchSize = 1000

但这并没有帮助。

javascript mongodb iterator
2个回答
13
投票

当您在 Java 脚本中使用 for in 语句时,它会迭代

enumerable
Object
属性。

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

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

总共有

49
Cursor
这样的属性。这就是为什么无论您迭代空集合还是包含超过 1000 条记录的集合,结果总是为 49。您正在迭代这些属性,而不是光标中的结果。

如果您注意到这些可枚举属性,您会发现

hasNext
map
forEach
相当于光标的
properties
。所以你需要利用这些属性来迭代光标。

迭代游标中的结果:

var myCursor = db.x.find();

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

或者,

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

})

或者,

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

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


0
投票

在我的场景中,我想使用旧式

For-loop
,而不是
forEach

如果我们简单地在查询末尾添加

.toArray()
,一切都会按我的预期工作:

const items = db.getCollection(xxx)
    .find({ ... })
    .toArray(); // The Magic (!)

for (var i = 0; i < items.length; i++) {
    console.log(items[i]);
}
© www.soinside.com 2019 - 2024. All rights reserved.