0

抱歉,但我是 MongoDB 的新手,我想我了解分片的概念,以及如何通过散列分片键在服务器之间分布数据 - 但是我不确定您如何知道要查询哪个分片。

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

    $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,而且session数据会发生变化,所以不能作为shard key

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

4

2 回答 2

1

这只是MongoDB 分片集群的限制。为什么不在会话中保留_id?或者,也许您可​​以使用用户的 userId/loginId 作为文档的 _id 或分片键。

于 2014-04-25T11:02:37.490 回答
1

但是,我不确定您如何知道要查询哪个分片。

散列_id索引的问题在于它们不需要您知道要查询的分片。MongoDB 使用哈希来知道将文档放在集群中的哪个位置,但不知道如何查询。

这意味着您可以通过正常查询ObjectId,它会自动路由到正确的分片和所述分片上的正确文档。

我收到以下错误:

正如上面@helmy 的回答中所说:_id由于限制,您需要分片键或文档的分片键(基本上它怎么能知道?)。

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

array('multiple' => true)

到您的查询。

然而,它会执行分散和收集操作,换句话说,它会发送到所有分片并询问结果,然后根据该结果采取行动。有什么要记住的。

于 2014-04-25T14:55:43.323 回答