Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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_Sharding_Mongodb Indexes - Fatal编程技术网

Php 没有有效的碎片密钥,MongoDB无法插入内容

Php 没有有效的碎片密钥,MongoDB无法插入内容,php,mongodb,sharding,mongodb-indexes,Php,Mongodb,Sharding,Mongodb Indexes,对不起,我是MongoDB的新手 我想我理解切分的概念,以及如何通过散列切分密钥在服务器之间分发数据——但是我不确定您如何知道要查询哪个切分 例如,我有一个用户集合,它是分片的,索引为_id_hash(到目前为止,很好-均匀分布的用户数为db),然后我需要对那些在设定时间内处于非活动状态的用户超时 $c->update(array('session.lastLogged'=>array('$lt'=>$time - ($timeout*60))), array('$se

对不起,我是MongoDB的新手 我想我理解切分的概念,以及如何通过散列切分密钥在服务器之间分发数据——但是我不确定您如何知道要查询哪个切分

例如,我有一个用户集合,它是分片的,索引为_id_hash(到目前为止,很好-均匀分布的用户数为db),然后我需要对那些在设定时间内处于非活动状态的用户超时

    $c->update(array('session.lastLogged'=>array('$lt'=>$time - ($timeout*60))), array('$set' => array('session'=>'') ));
我得到以下错误:

For non-multi updates, must have _id or full shard key ({ _id: "hashed" }) in query
但是,我不知道要查询的id,会话数据将发生更改,因此无法用作碎片密钥

这是我的数据结构问题还是我的查询问题?

这只是一个问题。你为什么不在会话中保留_id?或者您可以使用用户的userId/loginId作为文档的_id或shard键

然而,我不确定您如何知道要查询哪个碎片

散列
\u id
索引的一点是,它们不需要您知道要查询的碎片。MongoDB使用散列来知道文档在集群中的位置,但不知道如何查询文档

这意味着您可以通过正常的
ObjectId
进行查询,它将自动路由到正确的shard和所述shard上的正确文档

我得到以下错误:

For non-multi updates, must have _id or full shard key ({ _id: "hashed" }) in query
正如上面@helmy的回答中所说的:由于限制(基本上它怎么知道其他情况?),您需要文档的shard键或
\u id

由于您实际上正在尝试更新所有用户,我只想添加:

array('multiple' => true)
请回答您的问题

然而,它将执行分散和聚集操作,换句话说,它将前往所有碎片并请求结果,然后根据该结果采取行动。在那里有一些需要在脑海中表达的东西