gpt4 book ai didi

python - PyMongo 不会遍历集合

转载 作者:太空狗 更新时间:2023-10-30 02:13:17 26 4
gpt4 key购买 nike

我在 Python/PyMongo 中有奇怪的行为。

dbh = self.__connection__['test']
first = dbh['test_1']
second = dbh['test_2']

first_collection_records=first.find()
second_collection_records=second.find()


index_f=first_collection_records.count() //20
index_s=second_collection_records.count() //120

i=0
for f in first_collection_records:
for s in second_collection_records:
i=i+1
print i

它只打印 120 次 (1..120) 而不是 20x120 次。有人能告诉我为什么它不遍历外部集合吗?我打印了结果,它总是只需要第一个外部集合并迭代内部集合。 (我发布了我在代码 20 和 120 中获得的计数,我尝试使用 xrange 并按索引获取但没有任何结果)

最佳答案

如果您想为每个 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() 将游标重置为新状态,使您能够再次检索 second_collection_records 中的数据。


解释:

second.find()

返回一个 Cursor 对象,其中包含一个迭代器。

当 Cursor 的迭代器到达其末尾时,它不再返回任何内容。

因此:

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() 方法工作的,如:调用 second_collection_records.next() 直到 second_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

关于python - PyMongo 不会遍历集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9789601/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com