如果你想为每个first_collection_records迭代second_collection_records,你可以使用:
i=0
for f in first_collection_records:
second_collection_records.rewind() #Reset second_collection_records's iterator
for s in second_collection_records:
i=i+1
print i
.rewind() 将游标重置为新状态,使您能够再次检索 secondary_collection_records 中的数据。
解释:
second.find()
返回一个 Cursor 对象,其中包含一个迭代器。
当 Cursor 的迭代器到达末尾时,它不再返回任何内容。
thus:
for f in first_collection_records: #20
实际上确实迭代了20次,但是由于内部:
for s in second_collection_records:
已经迭代了所有返回的对象,第二次调用时, Second_collection_records 不再返回任何内容,因此里面的代码(i=i+1, print...) 不会被执行。
你可以这样尝试:
i = 0
for f in first_collection_records:
print "in f"
for s in second_collection_records:
print "inside s"
你会得到一个结果:
inside f
inside s
inside s
...
inside s
inside f <- since s has nothing left to be iterated,
(second_collection_records actually raised StopIteration such in generator),
code inside for s in second_collection_records: is no longer executed
inside f
inside f
深入解释:
这行:
for s in second_collection_records:
这里的循环实际上是通过 Cursor 对象的 next() 方法来工作的,如下所示:调用 secondary_collection_records.next() 直到 secondary_collection_records 引发 StopIteration 异常(在 Python 生成器和 for 循环中,StopIteration 被捕获,并且 for 循环内的代码不会被执行)。因此,在first_collection_records的第二个到最后一个循环中,second_collection_records.next()实际上为内部循环引发了StopIteration,而不是执行代码。
我们可以通过这样做轻松观察到这种行为:
for f in first_collection_records:
print "inside f"
second_collection_records.next()
for s in second_collection_records:
print "inside s"
结果:
inside f
inside s
...
inside s
inside f
Traceback (most recent call last):
... , in next
raise StopIteration
StopIteration