Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MongoDB更新操作和读取首选项_Php_Mongodb - Fatal编程技术网

Php MongoDB更新操作和读取首选项

Php MongoDB更新操作和读取首选项,php,mongodb,Php,Mongodb,如果我使用MongoClient::RP_SECONDARY的读取首选项对mongodb进行更新,我的更新操作是否可以读取过期记录以确定要更新哪些记录 很明显,我基本上是在问更新是否被视为写入操作,因此遵循“Secondary-复制主数据库内容的副本集成员。Secondary成员可以处理读取请求,但只有primary成员可以处理写入操作。请参阅Secondary” 因此,如果mongo决定将操作拆分为两个单独的组件,即查找要更新的记录的查询部分和写入部分,则读取部分可以从辅助设备读取过期数据。M

如果我使用MongoClient::RP_SECONDARY的读取首选项对mongodb进行更新,我的更新操作是否可以读取过期记录以确定要更新哪些记录

很明显,我基本上是在问更新是否被视为写入操作,因此遵循“Secondary-复制主数据库内容的副本集成员。Secondary成员可以处理读取请求,但只有primary成员可以处理写入操作。请参阅Secondary”


因此,如果mongo决定将操作拆分为两个单独的组件,即查找要更新的记录的查询部分和写入部分,则读取部分可以从辅助设备读取过期数据。

MongoDB不会将查询从更新中拆分。所有MongoDB驱动程序都使用MongoDB wire协议向它们所连接的mongo实例发送和接收数据。更新、插入、查询和删除具有不同的操作码和格式。操作码OP_UPDATE、OP_INSERT和OP_DELETE都将其有效负载标识为对数据的更改,并将始终路由到主服务器,并将考虑写入首选项。操作码OP_查询将使用读取首选项


关于连线协议的更多细节,请参见此处:

如果我能麻烦您跟进,鉴于您所说的,我不明白以下情况是如何发生的。“使用唯一的索引警告以避免多次插入同一文档,仅在查询字段唯一索引时使用UpSert:TRUE。给定一个名为“人”的集合,其中没有文档包含值安迪。请考虑多个客户端同时以UpSert参数发布以下更新”这是因为更新显然是从过时的源读取的,否则它不会从两个客户机上重复插入两次?不,这是一个时间问题-client1读取并没有看到名称为Andy的客户,并且它准备插入-这不是一个原子操作。client1在插入阶段之前向client2屈服,client2读取并没有看到Andy,因此它也准备插入。它让client1成功插入,然后让client2失败。这个问题与更新不是原子性的有关,也不是因为读取已过期——不是在读取时,而是在文档更改的插入阶段之前。对于这个用例,您应该使用FindAndModify,它是原子的。我在您的中找不到任何关键字
primary
route
replica
,从那里您可以得到关于具有不同操作的副本路由的消息?