2013-03-28 54 views
5

我有一個當前由內置的「_id」(ObjectId)索引/查詢的集合。我不想在這個鍵上分割,因爲它是順序的(帶有日期前綴)。 Mongo 2.4的文檔說我可以使用這個鍵的散列碎片,這聽起來很棒。像這樣:在MongoDB中正確實現散列分片密鑰

sh.shardCollection( 「records.active」,{_id: 「哈希」})

問:我必須在與主動收集首先創建散列索引:

db.active.ensureIndex({_id:「hashed」})

或者那不是必需的?我不想浪費太多的空間,索引比必要的更多。

相關的問題:如果我做創建ensureIndex({_id:「哈希」})散列索引我可以刪除默認的「ID」指數?請問Mongo知道對_id字段進行查詢,對它們進行散列並將它們運行到散列索引?

謝謝...

回答

3

無論是_id指數和散列_id指數將需要。在MongoDB 2.4中,您不必在分割集合之前明確地調用db.active.ensureIndex({_id:「hashed」}),但是如果您不是sh.shardCollection(「records.active」,{ _id:「hashed」})會爲你創建散列索引。

_id索引是複製所必需的。

要在MongoDB中分割一個集合,必須在分片鍵上有一個索引。這在MongoDB 2.4中並沒有改變,哈希_id索引將是分片工作所必需的。

0

我已經嘗試了我自己,使用mongoDB 2.4.11。

我創建並將文檔插入新集合。查詢被解僱了mongos服務器。我插入的所有1,000,000個文檔都作爲分片羣集主要分片(作爲分片羣集主體(可以使用sh.status()進行檢查))。

然而,當我試圖做的命令碎片收集按照以下,

sh.shardCollection("database.collection",{_id:"hashed"}) 

它顯示錯誤如下

{ 
    "proposedKey" : { 
     "_id" : "hashed" 
    }, 
    "curIndexes" : [ 
     { 
      "v" : 1, 
      "name" : "_id_", 
      "key" : { 
       "_id" : 1 
      }, 
      "ns" : "database.collection" 
     } 
    ], 
    "ok" : 0, 
    "errmsg" : "please create an index that starts with the shard key before sharding." 
} 

所以答案是

  1. 是它需要散列索引
  2. 你要cre吃了預先,MongoDB的需要你它手動使用以下命令做:

    db.collection.ensureIndex({_id: 「散列」})