PyMongo使用入门(四)

来源:互联网 发布:淘宝鹊桥软件 编辑:程序博客网 时间:2024/06/09 17:05

批量插入

import pymongofrom pprint import pprintfrom pymongo.errors import BulkWriteErrordb = pymongo.MongoClient().bulk_exampledb.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)
0 0