2014-08-29 65 views
0

不知道這裏或爲什麼發生了什麼,似乎當我在一個遊標上進行迭代時它會移動它,因爲我無法從相同的起點運行第二個循環。我的例子:迭代在PyMongo中移動光標?

players = db.player.find({'parent_api__id' : 'stats', 'game__id':{'$in':games_list}, "played":"true"}); 

count = 0; 
for c in players: 
    count = count + 1 

for c in players: 
    game = db.game.find_one({'parent_api__id':'schedule', 'id':c['game__id']}) 
    c['date'] = game['scheduled'] 
    print c 

在這一個它從未進入第二循環,如果我把打印上去頂它永遠不會打它,它從來不會在底部

打印C現在如果我評論出在它的計數循環,所以它看起來是這樣的:

players = db.player.find({'parent_api__id' : 'stats', 'game__id':{'$in':games_list}, "played":"true"}); 

#count = 0; 
#for c in players: 
# count = count + 1 

for c in players: 
    game = db.game.find_one({'parent_api__id':'schedule', 'id':c['game__id']}) 
    c['date'] = game['scheduled'] 
    print c 

然後進入第二循環並迭代完全沒問題(打印出來,因爲它去一起)

這是爲什麼?我必須在每次使用其他球員時重置光標= db.player.find({'parent_api__id':'stats','game__id':{'$ in':games_list},「played」:「true」 }); ?似乎不可能如此。

感謝您提供任何幫助!

+0

這是在Python和其他語言中使用的標準['Iterator'](https://docs.python.org/2/library/stdtypes.html#iterator-types)模式。迭代結果集兩次似乎不常見。 – Stennie 2014-08-30 11:22:03

回答

0

是的,遊標(按定義)指向下一個項目(在Mongo的情況下爲文檔),一旦當前項目被迭代,遊標本身提供了一個迭代器函數,並在內部維護一個指向已經「消耗」。

有解決你所面臨的問題有兩種方法,

  • 首先是使用遊標的​​方法將光標移動到其未評估的原始狀態

  • 其次,克隆光標使用clone(),它會給你第二個遊標,它將是第一個遊標的精確克隆,但是將會是一個全新的實例。如果需要在整個評估過程中或在評估結束時維護兩個遊標的狀態,請使用此方法。

+0

請注意,這兩個選項都可能導致結果集不相同,這可能不是@ Synt4x預期的結果集。這些都是遊標重置的變體:'rewind()'重置遊標,因此查詢將用相同的選項重新評估; 'clone()'用相同的選項創建一個新的(未評估的)遊標。如果你想迭代*相同的數據,最好在單個循環中迭代。 – Stennie 2014-08-30 11:29:29

+0

@Stennie你的權利我不應該迭代兩次我可以在1循環內完成所有工作我已經將它們分開來測試數據是否準確,然後我將它迭代到Mongo集合中,但現在我可以合併爲一個。 – Synt4x 2014-08-30 18:00:50

+0

@Stennie同時雖然要清楚,但除非我通過我的第一個循環修改集合正確,否則rewind()或clone()都不應該給我發散的數據集?還是有一段時間我可以在第一次循環之後倒回()我的光標,並說它擊中了...... 23,650個元素,第二次通過它會碰到不同的數字? (與clone()相同) – Synt4x 2014-08-30 18:11:35