For循环Python中只运行一次

For循环Python中只运行一次

问题描述:

这里是我下面的代码:For循环Python中只运行一次

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 

下面我有张图片收集:

id:365 
id:345 
id:372 
id:370 
id:371 
id:380 
id:381 

基本上从上面的代码id:365,id:345,id:381应该是re从img集合中移出,但是我的代码只删除了img集合中的id:365

请帮我在这段代码纠正错误.....

+0

什么是cursor1的长度?'len(cursor1)'并写入调试语句,比如'print'Debug 1 id1“,id1' –

+0

try'db = client [”test“]' – The6thSense

+0

我试过用len(cursor1)没有长度()。另外我们如何找到光标的长度......它将所有文档存储在正确的....? – Svati

这将起作用。这删除列表中所有的id是由于一个generator是,当你调用db.alb.find()发电机值为提供的事实疲惫,当你在当你迭代它的循环,使第二次迭代它在它里面所以只有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 
+0

'后移除img的集合。非常感谢....我一直在努力为什么逻辑不工作... 。现在它的好...工作完美.... :) :)再次感谢.... :) – Svati

+0

我用这个代码作为我的基本代码与集合检查有几个文件。现在我有图像集合中的1万份文档,并尝试过,并得到以下错误:字符串索引必须是整数。我已经在答案部分发布了我的代码,请仔细研究一下...... – Svati

有这样做的更好的方法。例如,什么是这样的:

# 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_to_remove应该包含图像从您的img集合中删除。

[注:这可能不是最有效的,也没有这样做的最Python的方式]

+0

我认为,而不是alb_images我们可以使用cursor.values() –

+0

其实我是新来的蟒蛇和对不起,我不明白你用过的代码行....但从看到我觉得它是一样的我写了...如果不是,请纠正我,如果我理解错了。 – Svati

+0

@Svati你可能想阅读[list comprehension](http://www.python-course.eu/list_comprehension.php)。 –

我不知道哪里是你的代码失败。将调试语句写在正确的位置,以便您可以获取代码失败的位置。

例如

>>> for i in range(1,5): 
...  print "Debug 1- i: ", i 
...  for j in range(10,15): 
...   print "Debug 1.1- j ", j 
...   if j==13: 
...    break 
  1. cursor1码打印长度(我认为计数法)
  2. 后打印cursor1值REMOVE语句即db.img.remove({'_id':id1})

一个更您可以删除从IMG集合后全部过程db.img.remove({'_id':id1})

创建列表,它保存id1值和过程后,只是你从db.img

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}) 
+0

我在for循环之后使用print来查找它是否循环遍历每个文档 – Svati

+0

在问题中添加打印输出。还有一种情况是,你可以在所有处理'db.img.remove({'_ id':id1})' –

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 

对于上面的代码我得到的字符串索引必须是整数。我得到行ig = image ['images']

+0

你能否提供完整的追溯,并将其作为另一个问题提出,并删除这一个,它违背了SO政策:) – The6thSense

+0

什么是数据类型'image' ?打印“调试数据类型的图像:”,类型(图片) –

+0

我已经发布它作为另一个问题“字符串索引必须是在Python代码中的一个地方的整数” – Svati