0

field を持つドキュメントがいくつかあると仮定'State'すると、次のドキュメントで変更を検出する必要があります。そのために、現在のカーソルを次のものと比較しますnext()

cursor.forEach(
        function(thisCursor){
            print('Current: '+thisCursor.State);
            print('Next: '+cursor.next().State);
        }
)

しかし、出力は次のようになります。

Current: Florida
Next: Florida
Current: New Mexico
Next: New Mexico

したがって、明らか.next()にまったく機能していません。なぜこれが発生するのかについてのアイデアはありますか?

ありがとう

4

1 に答える 1

2

コレクションを反復処理するために使用できますが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 を超える結果が得られた場合は、バッチ サイズをより大きな数に設定する必要がある場合があります。ここを参照してください。

于 2013-08-25T20:11:21.633 に答える