Php 没有有效的碎片密钥,MongoDB无法插入内容
对不起,我是MongoDB的新手 我想我理解切分的概念,以及如何通过散列切分密钥在服务器之间分发数据——但是我不确定您如何知道要查询哪个切分 例如,我有一个用户集合,它是分片的,索引为_id_hash(到目前为止,很好-均匀分布的用户数为db),然后我需要对那些在设定时间内处于非活动状态的用户超时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
$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)
请回答您的问题
然而,它将执行分散和聚集操作,换句话说,它将前往所有碎片并请求结果,然后根据该结果采取行动。在那里有一些需要在脑海中表达的东西