雖然你可以使用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
未被使用,所以它將步驟超出集合的長度。
您需要更改邏輯以實際讀取「下一個」文檔,而不會影響以下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;
}
它獲取一個文檔,然後獲取下一個文件,如果有一個,並確定它到第一個。然後,通過將以前的文檔與當前文檔進行比較來重複。循環直到沒有更多文檔。
如果您的邏輯變得更復雜,我強烈建議您嘗試使用Node.JS和本地MongoDB驅動程序。
此外,如果您的結果超過20個,則可能需要將批量大小設置爲較大的數字。見here。
您使用的是什麼平臺/編程語言? – WiredPrairie
只需mongoDB javascript命令行 – Joss