12

私は使用mongojsしていて、コレクション内のすべての要素を反復しようとしています

index = 0

db.keys.find({}, {uid: 1, _id: 0}).forEach((err, key) =>
    if err?
        console.log err
    else 
        console.log (++index) + " key: " + key_uid

どのログ

1 key: bB0KN
2 key: LOtOL
3 key: 51xJM
4 key: x9wFP
5 key: hcJKP
6 key: QZxnE
.
.
.
96 key: EeW6E
97 key: wqfmM
98 key: LIGHK
99 key: bjWTI
100 key: 2zNGE
101 key: F71mL

そして止まります。ただし、端末からmongoにログインして実行すると

> db.keys.count()
2317381

したがって、明らかに、より多くのキーを返す必要があります。この動作を引き起こしている可能性のあるアイデアはありますか?

4

2 に答える 2

11

each()ではなく、 メソッドを使用する必要がありますforEach()。forEach() は、バッチ内のすべてのドキュメントを反復処理します。これはデフォルトが 101 であることを発見したとおりです。each() は、カーソル内のすべてのドキュメントを反復処理します。ドキュメントから:

このカーソルのすべてのドキュメントを反復処理します。{cursor.toArray} と同様に、このカーソルが以前にアクセスされていた場合、すべての要素が反復されるわけではありません。その場合、{cursor.rewind} を使用してカーソルをリセットできます。ただし、{cursor.toArray} とは異なり、バッチ サイズが指定されている場合、カーソルは常に最大バッチ サイズの要素のみを保持します。それ以外の場合、呼び出し元は、結果全体がメモリに収まるようにする責任があります。

http://mongodb.github.io/node-mongodb-native/api-generated/cursor.html

コード例:

// Grab a cursor
      var cursor = collection.find();

      // Execute the each command, triggers for each document
      cursor.each(function(err, item) {

        // If the item is null then the cursor is exhausted/empty and closed
        if(item == null) {

          // Show that the cursor is closed
          cursor.toArray(function(err, items) {
            assert.ok(err != null);

            // Let's close the db
            db.close();
          });
        };
      });
于 2014-06-14T16:43:50.613 に答える
3

MongoDB ドライバーが最初のバッチでサーバーから取得したデフォルトのドキュメント数であるため、最初の 101 ドキュメントのみが表示されます。

ほとんどのクエリでは、最初のバッチは 101 個のドキュメント、または 1 メガバイトを超えるのに十分なドキュメントを返します。後続のバッチ サイズは 4 メガバイトです。

find使用してから、ドキュメントを反復処理することができます。

coll.find({}, {uid:1, _id : 0}, function(err, docs){
    if (err) {
        console.log(err);
        return;
    }
    docs.forEach(function(doc, index) { 
        console.log(index + " key: " + doc.uid) 
    });
});
于 2014-06-14T10:09:31.280 に答える