mongodb WriteConcern用法
格式:
{ w: <value>, j: <boolean>, wtimeout: <number> }以下转自:https://blog.csdn.net/leshami/article/details/52913705
w : 该选项要求确认操作已经传播到指定数量的mongod实例或指定标签的mongod实例 w可选的的值w:1(应答式写入) 要求确认操作已经传播到指定的单个mongod实例或副本集主实例(缺省为1) w:0(非应答式写入) 不返回任何响应,所以无法知道写入是否成功 但是对于尝试向已关闭的套接字写入或者网络故障会返回异常信息 w:>1(用于副本集环境) 该值用于设定写入节点的数目,包括主节点 "majority"(大多数) 适用于集群架构,要求写入操作已经传递到绝大多数投票节点以及主节点后进行应答 要求写入操作已经传递到指定tag标记副本集中的成员后进行应答 j : 该选项要求确认写操作已经写入journal日志之后应答客户端(需要开启journal功能) 则在意外重启,宕机等情形下可以通过journal来进行数据恢复 写入journal操作必须等待直到下次提交日志时完成写入 为降低延迟,MongoDB可以通过增加commit journal的频率来加快journal写入 wtimeout: 该选项指定一个时间限制,以防止写操作无限制被阻塞导致无法应答给客户端 wtimeout的单位为ms,当w值大于1时生效,该参数即仅适用于集群环境 当某个节点写入时超出指定wtimeout之后,mongod将返回一个错误 在捕获到超时之前,mongod并不会撤销其他节点已成功完成的写入 wtimeout值为0时等同于没有配置wtimeout选项,容易导致由于某个节点挂起而无法应答 对于单实例应答的情形,是将数据写入到内存后开始应答,除非j:true,则保证掉电后不会丢失数据
更多参考文档:
https://docs.mongodb.com/manual/reference/write-concern/#write-concern-acknowledged
http://www.ywnds.com/?p=3688
PHP7用法:
$manager = new MongoDB\Driver\Manager('mongodb://root:123@10.10.10.104:27017');MAJORITY方式:
$bulk = new MongoDB\Driver\BulkWrite; //默认是有序的,串行执行 $bulk->update( ['user_id' => 2], ['$set'=>['real_name'=>'中国我的国'] ]); $writeConcern= new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//确认,MAJORITY 1000毫秒 $manager->executeBulkWrite('location.box', $bulk,$writeConcern);
db.box.insert({"user_id":2,"real_name":"lijie"},{writeConcern:{w:"majority",j:1,wtimeout:1000}})
其他方式:
final public MongoDB\Driver\WriteConcern::__construct ( string|integer $w
[, int $wtimeout
[, bool $journal
]] )
$writeConcern = new MongoDB\Driver\WriteConcern(1, 1000, true); $manager->executeBulkWrite('location.box', $bulk,$writeConcern); print_r($writeConcern->bsonSerialize());exit; //打印concern设置
这里输出:
stdClass Object | |
( | |
[w] => 1 | |
[j] => 1 | |
[wtimeout] => 1000 | |
) | |
db.box.insert({"user_id":2,"real_name":"lijie"},{writeConcern:{w:1,j:1,wtimeout:1000}})
db.things.insert({dd:123},{writeconcern:{w:2}})是设置当前插入的SQL的writeconcern; db.setWriteConcern({w:1,wtimeout:3000,j:1})是设置当前的db的writeconcern值; db.getWriteConcern()是获取当前db的write concern设置