1

mongodbのコレクションをスキャンしてすべてのアイテムを編集していたとき、次の質問がありました。なぜこれが起こっているのですか?誰でもそれを理解できますか?

デシベル。baiduwords.find().count() = 805280

デシベル。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 に答える