PyMongo使用入门(四)

批量插入

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})

#违反了_id唯一键约束。
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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值