批量插入
import pymongo
from pprint import pprint
from pymongo.errors import BulkWriteError
db = pymongo.MongoClient().bulk_example
db.test.insert_many([{'i' : i} for i in range(10000 )]).inserted_ids
有序批量写操作
#初始化bulk()
#有序列表操作
bulk = db.test.initialize_ordered_bulk_op()
#删除所有文件
bulk.find({}).remove()
bulk.insert ({'_id' : 1 })
bulk.insert ({'_id' : 2 })
bulk.insert ({'_id' : 3 })
bulk.find({'_id' : 1 }).update ({'$set' : {'foo' : 'bar' }})
bulk.find({'_id' : 4 }).upsert().update ({'$inc' : {'j' : 1 }})
bulk.find({'j' : 1 }).replace_one({'j' : 2 })
result = bulk.execute ()
pprint(result)
如图:
错误处理
"""发生(如重复键错误)第一个写失败中止剩余的操作,PyMongo提高BulkWriteError。
异常实例的详细信息attibute提供执行结果,直到发生故障,对故障的详细信息 - 包括导致失败的操作。
"""
bulk = db.test.initialize_ordered_bulk_op()
bulk.find({'j' : 2 }).replace_one({'i' : 5 })
bulk.insert({'_id' : 4 })
bulk.find({'i' : 5 }).remove_one()
try :
bulk.execute()
except BulkWriteError as bwe:
pprint(bwe.details)
如图:
无序批量写操作
"""
#无序批量写操作
#在无序批量操作的情况下却没有保证的操作被执行的顺序
"""
bulk = db.test.initialize_unordered_bulk_op()
bulk.insert({'_id' : 1 })
bulk.find({'_id' : 2 }).remove_one()
bulk.insert({'_id' : 3 })
bulk.find({'_id' : 4 }).replace_one({'i' : 1 })
try :
pprint(bulk.execute())
except BulkWriteError as bwe:
pprint(bwe.details)
写入策略(writeConcern)
"""首先列一下WriteConcern的几种抛出异常的级别参数:
WriteConcern.NONE:没有异常抛出
WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。
MongoDB使用w:1作为默认值。可选值和含义如下:
1 对于单个的mongod或者集群的主要节点,提供了答复
0 禁止最基本的答复功能,只提供了关于套接字异常和网络错误的信息给客户端。如果禁止答复的同时要求日志,那么日志请求会被执行,服务器会进行答复
大于1 针对集群,要求1个主节点和w-1个从节点答复,如果w的值大于主节点和从节点的和,那么会一直阻塞直到别的节点上线
majority 针对集群,要求所有投票节点的大部分进行答复。这样就避免了硬编码的节点数量,更加灵活。在3.0版本之前,对应的是成员节点的大部分。
"""
"""
wtimeout
这个值只针对w的值设置为大于1的场合有效,即只针对副本集环境有效。
当发生超时时就会返回一个错误,即使最终数据write成功了,这时mongodb不会回滚已经修改成功的数据。
该值设置为0就是不做限制。
"""
bulk = db.test.initialize_ordered_bulk_op()
bulk.insert({'a' : 0 })
bulk.insert({'a' : 1 })
bulk.insert({'a' : 2 })
bulk.insert({'a' : 3 })
try :
bulk.execute({'w' : 3 , 'wtimeout' : 1 })
except BulkWriteError as bwe:
pprint(bwe.details)