4

ループ内の pymongo の挿入に関するトリッキーな問題があります。insert() を使用すると結果が最初のレコードのみになり、save() を使用すると最後のレコードになるのはなぜですか。

from pymongo import Connection

m = Connection(config.get('server'))
mdb = m[config.get('db_name')]

cond = {
    'corp_fax_no'  : u'5667767', 
    'corp_area_id' : 12L, 
    'corp_url'     : u'http://www.example.com', 
    'corp_id'      : 1L, 
    'corp_addr'    : u'some thing', 
    'corp_post_no' : u'220940', 
    'corp_email'   : u'123@123.com', 
    'corp_tel_no'  : u'714-717-2265'
}

@tool.timeit
def test_insert_mongo():
    cn = '{0}'.format(config.get("coll_timetest"))
    coll = mdb[cn]
    for i in xrange(10000):
        print i
        cond.update({'corp_id':i})
        coll.insert(cond)

test_insert_mongo()

Mongo に 10000 エントリを挿入しただけですが、1 つのエントリしか見つかりません。なんで?

4

1 に答える 1

5

渡されたドキュメントにがcollection.insert()含まれていない場合は_id、保存時に追加されます(pymongo apiを参照)。これは、最初の呼び出しの後、ドキュメントにが含まれているため、再度挿入されない_idことを意味します。

保存されたドキュメントを呼び出すcollection.save()と更新され、最後の値がcorp_idとして渡された単一のドキュメントになります。

単純な「修正」は_id、.insert()を呼び出す前に、各反復でdictからキーを削除することです。

for i in xrange(10000):
    cond.update({'corp_id':i})
    cond.pop('_id', None)
    coll.insert(cond)
于 2011-05-07T18:28:41.307 に答える