1

当我在mongodb中扫描一个集合并编辑所有项目时,我得到了这个问题:扫描计数器 i 可以大于 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:这个数据库没有启用分片。

4

1 回答 1

2

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

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

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

于 2013-04-25T04:01:08.833 回答