コレクションを反復処理するために使用できますがforEach
、他のすべてのインデックスをスキップすることになります。
カーソルは、結果セット内の単なる位置です。forEach
通常、現在のアイテムを次のアイテムに移動しますがnext
、カーソル インスタンスで手動で呼び出すと、おそらく意図せずにコレクションをスキップします。
> db.states.remove()
> db.states.insert({name: "alabama"})
> db.states.insert({name: "alaska"})
> db.states.insert({name: "arkansas"})
> db.states.insert({name: "wisconsin"})
> db.states.insert({name: "west virginia"})
次に、カーソルを初期化します。
> var cursor=db.states.find();
私が使用するforEach
場合next
:
> cursor.forEach(function(item){
print("name: " + item.name);
print("next name: " + cursor.next().name); })
結果は次のとおりです。
name: alabama
next name: alaska
name: arkansas
next name: wisconsin
name: west virginia
Sun Aug 25 15:04:12.197 error hasNext: false at src/mongo/shell/query.js:124
ご覧のとおり、カーソルはコレクション内を移動し、hasNext
使用されていないため、コレクションの長さを1 つ超えています。
「次の」ドキュメントを実際に読み取り、次のforEach
ループ反復に影響を与えないようにロジックを変更する必要があります。
私はあなたのデータの性質を理解していませんが、次のようなことができるかもしれません:
> var doc=cursor.hasNext() ? cursor.next() : null;
> while(doc) {
var currentDoc=cursor.hasNext() ? cursor.next() : null;
if(currentDoc && currentDoc.name === doc.name) {
print("matched: " + currentDoc.name);
}
doc = currentDoc;
}
1 つのドキュメントを取得し、次のドキュメントがあればそれを取得して最初のドキュメントと比較します。次に、前のドキュメントと現在のドキュメントを比較して繰り返します。ドキュメントがなくなるまでループします。
ロジックがより複雑になる場合は、Node.JS とネイティブの MongoDB ドライバーを使用することを強くお勧めします。
また、20 を超える結果が得られた場合は、バッチ サイズをより大きな数に設定する必要がある場合があります。ここを参照してください。