PyMongo中的迭代是否移动光标?

1 投票
1 回答
817 浏览
提问于 2025-04-18 21:14

我不太明白这里发生了什么,也不知道为什么。看起来当我在一个游标上进行迭代时,它会移动游标,因为我不能从同一个起点再运行第二个循环。我的例子是:

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

那么它就能进入第二个循环,并且完全正常地迭代(边迭代边打印)。

这是为什么呢?我每次在两个循环之间都需要用另一个 players = db.player.find({'parent_api__id' : 'stats', 'game__id':{'$in':games_list}, "played":"true"}); 来重置游标吗?感觉这不是设计的初衷。

感谢你能提供的任何帮助!

1 个回答

2

没错,光标(cursor)是用来指向下一个项目的(在Mongo中就是指下一个文档),当你处理完当前项目后,光标会自动指向下一个。光标本身提供了一种迭代功能,并且内部会保持一个指针,指向那些已经“消费掉”的项目。

你遇到的问题有两种解决方法:

  • 第一种方法是使用光标的 rewind() 方法,这个方法可以把光标重置到最初的状态,也就是未处理过的状态。

  • 第二种方法是用 clone() 来克隆光标,这样你会得到一个新的光标,它和第一个光标完全相同,但实际上是一个全新的实例。如果你需要在处理过程中或结束时保持两个光标的状态,可以使用这个方法。

撰写回答