вставка пимонго внутри петли - PullRequest
4 голосов
/ 06 мая 2011

все у меня есть каверзная проблема с вставкой пимонго внутри цикла. Почему результатом является только первая запись, если я использую 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()

Я просто вставляю 10000 записей в Монго, но я могу найти только одну запись.Почему?

1 Ответ

5 голосов
/ 07 мая 2011

Если документ, переданный в collection.insert(), не содержит _id, он будет добавлен при сохранении (см. pymongo api ). Это означает, что после первого вызова документ имеет _id и, следовательно, не будет вставлен снова.

Если вы позвоните collection.save(), сохраненный документ обновится, и вы получите один документ с последним значением, переданным как corp_id.

Простым «исправлением» будет удаление ключа _id из dict на каждой итерации перед вызовом .insert ():

for i in xrange(10000):
    cond.update({'corp_id':i})
    cond.pop('_id', None)
    coll.insert(cond)
...