2015-07-10 203 views
1

這裏是我下面的代碼: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

回答

1

這將起作用。這刪除列表中所有的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

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集合中刪除。

[注:這可能不是最有效的,也沒有這樣做的最Python的方式]

+0

我認爲,而不是alb_images我們可以使用cursor.values() –

+0

其實我是新來的蟒蛇和對不起,我不明白你用過的代碼行....但從看到我覺得它是一樣的我寫了...如果不是,請糾正我,如果我理解錯了。 – Svati

+0

@Svati你可能想閱讀[list comprehension](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值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})' –

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 

對於上面的代碼我得到的字符串索引必須是整數。我得到行ig = image ['images']

+0

你能否提供完整的追溯,並將其作爲另一個問題提出,並刪除這一個,它違背了SO政策:) – The6thSense

+0

什麼是數據類型'image' ?打印「調試數據類型的圖像:」,類型(圖片) –

+0

我已經發布它作爲另一個問題「字符串索引必須是在Python代碼中的一個地方的整數」 – Svati