insert - pymongo 在循环内插入

标签 insert pymongo

我对循环内的 pymongo insert 有一个棘手的问题,为什么如果我使用 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 个条目,但我只能找到一个条目。为什么?

最佳答案

如果文件传递给 collection.insert()不包含 _id ,它将在保存时添加(参见 pymongo api )。这意味着在第一次调用之后,文档 有一个_id因此将不是 重新插入。

如果您调用collection.save()存储的文档已更新,您最终将得到一个文档,其中最后一个值作为 corp_id 传递。

一个简单的“修复”是删除 _id在调用 .insert() 之前,每次迭代时从字典中获取键:

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

关于insert - pymongo 在循环内插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5906493/

相关文章:

java - 在 Java vector 中插入 null

perl - 如何在 Perl 中将数组数据插入 MySQL?

python - httpretty.enable() 之后 MongoClient 连接失败

MongoDB、PyMongo - 根据查找条件聚合

python - PyMongo/Mongoengine 相当于 mongodump

python - 在 Pymongo 中执行批量插入时如何忽略错误。我在 pymongo 中使用有序的批量写入操作

Oracle 相当于 MySQL INSERT IGNORE?

postgresql - 带有 INSTEAD OF 触发器的 Postgres INSERT ON CONFLICT 行为

python - 使用 pymongo 读取和更新 mongodb 文档的最佳方法

php - 有没有办法检查 php mysql 中 "SELECT... INTO OUTFILE"的执行时间(已过或剩余)?