2013-04-06 53 views
6

例如,如果我想將用戶名作爲我的mongo文檔的唯一ID,而不是默認的「_id」,該怎麼辦?MongoDB:如何設置另一個字段(不同於_id)作爲mongo文檔的ID?

我想使用mongo.exe控制檯來實現此目的。

+2

如果用戶名可以更改,並且用於其他文檔,我建議您不要將它們設爲主鍵('_id'),因爲您需要更新指向新用戶名的所有位置(因爲MongoDB中沒有事務,所以你會遇到計時問題)。 – WiredPrairie 2013-04-06 19:17:51

回答

14

MongoDB需要_id屬性作爲它自動索引的唯一主鍵。

你有兩個選擇:

  1. 使用_id屬性,並使用用戶名設置。
  2. 創建一個用戶名屬性,然後在該新屬性上添加一個索引。您仍然會擁有_id,但可以使用用戶名進行查詢。
+1

我知道,有可能有像{用戶名:「約翰」,年齡:12}這樣的記錄。我的意思是,沒有_id。這個怎麼做? – Andrei 2013-04-06 20:16:07

+2

你爲什麼要刪除_id? – cirrus 2013-04-06 23:17:09

+3

當你定義用戶名索引時,你可以要求它是唯一的,如果這是你的顧慮。 _id很小且很有幫助。只要不要理會,直到你明白mongodb。 – Leopd 2013-04-07 03:28:12

0

我知道,這是可能有這樣的記錄像{用戶名: 「約翰」,年齡:12}。我的意思是,沒有_id。這個怎麼做?

我不確定@Serges怎麼回答是不夠清楚不過,再次重申,沒有辦法。從技術上講,你仍然可以在某些版本的MongoDB中去除封閉集合中的_id,但除此之外你不能。

另外我擔心你使用的用戶名,它可能不是最好的活動,如分片,並可以創建集羣等高活躍的「熱點」,這是所有的理論,因爲我不在你的位置與你的數據,但是,最好考慮這個東西。

+0

感謝您的答案,但我只想知道,它怎麼可能。讓我提供一些更多細節。我使用.NET驅動程序,我可以這樣編碼: class用戶 { [BsonId] public string Username {get;組; } public string Password {get;組; } } 當我把這樣的類的對象放到mongodb中時,我得到的對象沒有_id,我很想知道,驅動程序如何解釋這個對象。操作如何? – Andrei 2013-04-06 22:31:56

+0

@AndreiMikhalevich等等,「當我把這樣的類的對象放到mongodb中時,我得到的對象沒有_id,」你是什麼意思?你是說你用_id保存一個對象,並且在數據庫中沒有_id?這應該是不可能的 – Sammaye 2013-04-06 22:48:49

+0

@AndreiMikhalevich:如果你插入一個沒有'_id'的對象,C#驅動程序會爲你生成一個。'_id'是MongoDB文檔的必需主鍵;您可以選擇使用自己的標識符或使用默認的[ObjectID](http://docs.mongodb.org/manual/reference/object-id/)。 – Stennie 2013-04-07 05:47:37

1

_id在複製中很重要。您可以創建一個沒有_id索引的集合,但是您的將永遠無法複製數據庫。複製需要每個集合上的_id索引。

相關問題