迭代会在PyMongo中移动光标吗?

时间:2014-08-29 18:36:02

标签: python 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},"播放":" true"}); ?似乎这不是预期的方式。

感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

是的,一旦当前项被迭代,游标(按照定义)指向下一个项目(Mongo的文档),游标本身提供一个迭代器函数,并在内部维护指向已经“消耗”。

有两种方法可以解决您面临的问题,

  • 首先使用光标的rewind()方法将光标设置为未评估的原始状态

  • 其次,使用clone()克隆光标,这将为您提供第二个光标,它将是第一个光标的精确克隆,但将是一个全新的实例。如果您需要在评估期间或评估结束时保持两个游标的状态,请使用此选项。