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
    (我认为是计数法)
  • 在remove语句后打印
    cursor1
    值,即
    db.img.remove({u id':id1})
  • 还有一个您可以在所有进程之后从img中删除集合吗
    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
    try
    db=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