2014-04-25 35 views
0

對不起,但我是新來的MongoDB 我想我理解碎片的概念,以及如何通過哈希分片鍵跨服務器分佈數據 - 但我不確定你是如何知道你要查詢哪個分片。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 

不過,我不知道這個編號來查詢和會話數據會發生變化,所以不能充當片鍵

這是我的數據結構或查詢的問題嗎?

回答

1

however I am then unsure on how you know which shard you are to query.

約散列_id指標的事情是,他們不需要你知道要查詢的碎片。 MongoDB使用哈希來知道將文檔放在集羣中的位置,但不知道如何查詢。

這意味着您可以通過正常的ObjectId進行查詢,並且它會自動路由到所述分片上的右分片和正確的文檔。

I get the following error:

正如@ helmy的回答上面說的:你需要無論是片鍵或文檔由於限制_id(它基本上怎麼能知道,否則?)。

既然你事實上是在試圖更新所有用戶的我反而只是增加:

array('multiple' => true) 

到您的查詢。

然而,它會做一個分散和收集操作,換句話說,它會出去所有的碎片,並要求結果,然後採取行動的結果。那裏有一些事情需要考慮。