mongodb的cursor.count()实际计数是多少?

时间:2013-04-24 12:58:37

标签: python mongodb count pymongo

当我在 mongodb 中扫描一个集合并编辑所有项目时,我得到了这个问题:扫描计数器我可以大于cursor.count()。为什么会这样?有人能想出来吗?

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

db.baiduwords.find()。size()= 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:此数据库没有启用分片。

1 个答案:

答案 0 :(得分:2)

当您保存项目时,可能会移动更新的文档,导致光标多次返回文档。

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

  

当游标返回文档时,其他操作可能会与查询交错:如果其中一些操作是导致文档移动的更新(在表扫描的情况下,由文档增长引起)或更改索引查询使用的索引上的字段;然后光标将多次返回同一文档。