2015-07-10 6 views
1

Вот мой код ниже:цикл работает только один раз в питона

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, но мой код удаляет только id:365 в коллекции img.

Пожалуйста, помогите мне в исправлении ошибок в этом коде .....

+0

Что такое длина 'cursor1'?'len (cursor1)' и писать операторы отладки, такие как 'print 'Debug 1 id1", id1' –

+0

try 'db = client [" test "]' – The6thSense

+0

Я пробовал с len (cursor1), я получаю ошибку, как объект типа курсора имеет no length(). Также как мы можем найти длину курсора ... он сохраняет все документы правильно ....? – Svati

ответ

1

Это будет работать .Это связано с тем, что generator предоставляется при вызове db.alb.find()значение генератора истощен, когда вы итерацию над ней в течение цикла, так во второй раз, когда вы итерацию его там нет никакого значения в нем так только цикл выполняется только один раз

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

Спасибо большое ... Я боролся за то, почему логика не работает ... .Но его хорошо ... отлично работает ... :) :) Еще раз спасибо .... :) – Svati

+0

Я использовал этот код, поскольку мой базовый код с проверкой коллекций имеет несколько документов. теперь у меня есть 1 lakh docs в коллекции изображений, и я попытался получить следующую ошибку: строковые индексы должны быть целыми числами. Я разместил свой код в разделе ответов, пожалуйста, загляните в это ... – Svati

1

Есть лучшие способы сделать это. Например, что о чем-то вроде этого:

# 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 коллекции.

[Примечание: Это, вероятно, не самый эффективный и не самый Pythonic способ сделать это.]

+0

Я думаю, вместо alb_images мы можем использовать cursor.values ​​() –

+0

на самом деле я новичок в python и жаль, что я не понимаю строку кода, которую вы использовали .... но, видя, что я чувствую, что это то же самое, что и я написали ... если не поправьте меня, если я понял это неправильно. – Svati

+0

@Svati Возможно, вы захотите ознакомиться с [пониманием списка] (http://www.python-course.eu/list_comprehension.php). –

0

Я не знаю, где ваш код не удается. Напишите заявление об отладке в правильном положении, чтобы вы могли получить код с ошибкой.

например.

>>> 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 значения после того, как удалить заявление т.е. 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, чтобы определить, проходит ли она по каждому документу. – Svati

+0

добавьте вывод печати в вопрос. Еще один вы можете удалить коллекции из img после всего процесса 'db.img.remove ({'_ id': id1})' –

1
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 

для приведенного выше кода i get string index должны быть целыми. Я получаю строку ig = image ['images']

+0

вы могли бы предоставить полный ответ назад и задать его как другой вопрос и удалить его из-за политики SO :) – The6thSense

+0

что такое тип данных 'image' ? print «Debug Data type of image:», type (image) –

+0

Я разместил его как еще один вопрос «Индексы строк должны быть целыми числами в одном месте кода в python» – Svati

Смежные вопросы