2013-04-24 15 views
1

當我掃描mongodb並編輯所有的項目時,我得到了這個問題:掃描計數器我可以比cursor.count()大。這是爲什麼發生?任何人都能想出來嗎?是mongodb的cursor.count()的實際計數?

db.baiduwords.find()。COUNT()= 805280

db.baiduwords.find()。大小()= 805280

,但我去1498400或以上。

import pymongo 
if __name__=='__main__': 
    client = pymongo.MongoClient() 
    i = 0 
    collection = client.baike.baiduwords.find() 
    for item in collection: 
     i += 1 
     MajorClass = [] 
     for cl in item['C']: 
      c = cl 
      while(1): 
       a = client.baike.baiduclass.find({'s':c}) 
       if a.count(): 
        a = a[0] 
        if a['f'] == u'Root': 
         MajorClass.append(c) 
         break 
        else: 
         c = a['f'] 
       else: 
        break 
     item['MC'] = list(set(MajorClass)) 
     client.baike.baiduwords.save(item) 
     if i%100 == 0: 
      print "%d/%d"%(i, collection.count()) 

PS:printShardingStatus:這個db沒有啓用分片。

+0

這是一個分片收集? – 2013-04-24 13:12:21

+0

我不知道。但我從來沒有將其配置爲分片。 – 2013-04-24 13:36:10

+0

如果在這裏使用'size()'而不是'count()'會怎麼樣? – alecxe 2013-04-24 13:43:05

回答

2

這可能是當您保存您的項目時,更新的文檔可能會移動,導致光標不止一次返回文檔。

http://docs.mongodb.org/manual/faq/developers/#how-do-i-isolate-cursors-from-intervening-write-operations

爲光標返回文件,其他操作與查詢交錯:如果某些操作是導致文檔移動(在表掃描的情況下更新,造成通過文檔增長),或者改變查詢使用的索引上的索引字段;那麼光標將多次返回相同的文檔。

+1

謝謝!我使用collection = client.baike.baiduwords.find(snapshot = True),它正常運行。 – 2013-04-26 06:46:18