2014-08-29 77 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