For循环在python中只运行一次
下面是我的代码:For循环在python中只运行一次,python,pymongo,Python,Pymongo,下面是我的代码: import pymongo import sys client=pymongo.MongoClient('localhost',27017) db=client.test try: cursor= db.alb.find() cursor1=db.img.find() cntr=db.alb.count() print "looping sta
import pymongo
import sys
client=pymongo.MongoClient('localhost',27017)
db=client.test
try:
cursor= db.alb.find()
cursor1=db.img.find()
cntr=db.alb.count()
print "looping starts..."
for im in cursor1:
id1=im['_id']
cnt=0
print id1
for image in cursor:
ig=image['images']
print "image value:" , ig
print "id value:" , id1
if (id1 == ig):
break;
else:
cnt=cnt+1
print "count value", cnt
if (cnt == cntr):
print "removing..."
db.img.remove({'_id':id1})
print id1
print cnt
except Exception as e:
print "unexpected error", type(e),e
我在alb收集中有以下数据:
id:0 images:366
id:1 images:367
id:2 images:368
id:3 images:369
id:4 images:370
id:5 images:380
id:6 images:371
id:7 images:372
我在img收藏中有以下内容:
id:365
id:345
id:372
id:370
id:371
id:380
id:381
基本上,从上述代码中,id:365
,id:345
,id:381
应该从img集合中删除,但我的代码只删除img集合中的id:365
请帮助我更正此代码中的错误…有更好的方法。例如,像这样的东西怎么样:
# Get all image identifiers
alb_images = [image['images'] for image in cursor]
# Find the ones to remove
images_to_remove = [im for im in cursor1 if im['_id'] not in alb_images]
在上述操作之后,images\u to_remove
应该包含要从您的img
集合中移除的图像
[注意:这可能不是最有效的方法,也不是最适合的方法。]我不知道你的代码哪里出了问题。在正确的位置编写调试语句,这样就可以找到代码失败的地方 e、 g
cursor1
(我认为是计数法)cursor1
值,即db.img.remove({u id':id1})
db.img.remove({u id':id1})
创建保存id1
值的列表,在处理之后,只需从db.img中删除列表的所有id即可
remove_ids = []
# remove statement, append id value to list
remove_ids.append(id1)
# After process do
for id in remove_ids:
db.img.remove({'_id':id})
这将起作用。这是因为在调用db.alb.find()
时提供了一个generator
,当您在for循环中对其进行迭代时,该generator值将耗尽,所以第二次迭代时,其中没有值,因此仅for循环只运行一次
import pymongo
import sys
client=pymongo.MongoClient('localhost',27017)
db=client.test
try:
cursor1=db.img.find()
cntr=db.alb.count()
print "looping starts..."
for im in cursor1:
id1=im['_id']
cnt=0
print id1
cursor= db.alb.find() #move it here
for image in cursor:
ig=image['images']
print "image value:" , ig
print "id value:" , id1
if (id1 == ig):
break;
else:
cnt=cnt+1
print "count value", cnt
if (cnt == cntr):
print "removing..."
db.img.remove({'_id':id1})
print id1
print cnt
except Exception as e:
print "unexpected error", type(e),e
对于上面的代码,我得到的字符串索引必须是整数。我得到的第ig行=image['images']游标1的长度是多少len(cursor1)
并编写调试语句,如print“debug 1 id1”,id1
trydb=client[“test”]
我用len(cursor1)尝试过,我得到的错误类似于cursor类型的对象没有长度()。还有,我们怎样才能找到光标的长度…它存储了所有正确的文档…?Kalai:在我之前的代码中,我尝试了客户端。测试…我得到了输出…我认为这与我现在遇到的问题无关…两者都将做同样的工作…你能提出疑问吗,你想用你的代码做什么?删除id:365,id:345,id:381的基础是什么?我想我们可以用cursor.values()代替alb_图像事实上,我是python新手,很抱歉,我不了解您使用的代码行……但从我的观察来看,我觉得它与我所写的代码相同……如果不是,请纠正我是否理解错误。@Svati您可能想了解一下。我使用for循环后的print来确定它是否在每个docsadd打印输出中循环在这个问题上。还有一个问题,你可以在所有的过程之后从img中删除集合db.img.remove({u id:id1})
非常感谢……我一直在苦苦思索为什么逻辑不起作用……现在很好……工作得很好……):)再次感谢……:)我使用此代码作为我的基本代码,用于检查收集的文档很少。现在,我在图像集合中有10万个文档,并尝试了以下错误:字符串索引必须是整数。我已将我的代码张贴在“答案”部分,请仔细查看……您是否可以提供完整的回溯,并将其作为另一个问题提问,并删除此问题,因为这是违反SO政策的:)图像的数据类型是什么?打印“Debug Data type of image:”,type(image)我将其作为另一个问题发布“字符串索引必须是python代码中某个位置的整数”
import pymongo
import sys
client=pymongo.MongoClient('localhost',27017)
db=client.test
try:
cursor1=db.img.find()
cntr=db.alb.count()
print "looping starts..."
for im in cursor1:
id1=im['_id']
cnt=0
print id1
cursor= db.alb.find() #move it here
for image in cursor:
ig=image['images']
print "image value:" , ig
print "id value:" , id1
if (id1 == ig):
break;
else:
cnt=cnt+1
print "count value", cnt
if (cnt == cntr):
print "removing..."
db.img.remove({'_id':id1})
print id1
print cnt
except Exception as e:
print "unexpected error", type(e),e
import pymongo
import sys
client=pymongo.MongoClient('localhost',27017)
db=client.rop
try:
cntcur=db.albums.aggregate([{"$unwind":"$images"},{"$group":{"_id":"null","count":{'$sum':1}}}])
cursor1=db.images.find()
for im in cursor1:
id1=int(im['_id'])
cnt=0
cursor= db.albums.aggregate([{"$unwind":"$images"}])
print id1
for image in cursor:
print "moving to images collection"
ig=image['images']
if (id1 == ig):
break;
else:
cnt=cnt+1
if (cnt == cntr):
print "removing"
db.images.remove({'_id':id1})
except Exception as e:
print "unexpected error", type(e),e