mongodbガイド(十三)-developer zone-データ型と約束(二)のObject ID

4612 ワード

Object IDs
mongodbのドキュメントでは、一意のキーワードを使用する必要があります.idは彼らを識別する.
_idフィールド
ほとんどのmongodbドキュメントで使用されています.idフィールドは、最初の属性として使用されます(システムセットおよび定容量セット(capped collection)にはいくつかの例外があります).id値は任意のタイプであり、最も一般的な方法はObjectIdタイプを使用することである.各ドキュメントの_idフィールドは、このセットで一意でなければならない.これは集合が自動的に_idインデックスを確立して強制的に要求される(前述の例外を除く).
ユーザーがテープなしを挿入しようとした場合_idフィールドのドキュメントは、データベースが自動的にオブジェクトidを生成して保存します.idフィールド.
_id値は、配列を除いて一意である限り、任意のタイプであってもよい.ドキュメントに天然独自の変更不可能なプライマリ・キーがある場合は、自動生成の代わりに使用することをお勧めします.id.配列は_として許可されませんidは、マルチキーだからです.
BSON ObjectIdデータ型
しかしid値は任意のタイプであってもよいが、mongodbは依然としてオブジェクトidに特殊なBSONデータ型を提供する.このタイプは12バイトのバイナリ値として設計されており、これにより、割り当て時の一意性がかなり高い確率で保証される.すべての公式サポートmongodbドライバは、デフォルトでこのタイプを使用しています.idの値.同時に、mongoデータベース自体が挿入されていません.idフィールドのドキュメントの場合も、このタイプを使用して_id付与.
mongodb shellでは、ObjectId()はObjectIdsを布教するために使用することができる.ObjectId(String)は、指定した16進文字列を使用してオブジェクトIDを作成します.
> x={ name: "joe" }
{ name : "joe" }
> db.people.save(x)
{ name : "joe" , _id : ObjectId( "47cc67093475061e3d95369d" ) }
> x
{ name : "joe" , _id : ObjectId( "47cc67093475061e3d95369d" ) }
> db.people.findOne( { _id: ObjectId( "47cc67093475061e3d95369d" ) } )
{ _id : ObjectId( "47cc67093475061e3d95369d" ) , name : "joe" }
> db.people.findOne( { _id: new ObjectId( "47cc67093475061e3d95369d" ) } )
{ _id : ObjectId( "47cc67093475061e3d95369d" ) , name : "joe" }

BSON ObjectID詳細説明
1つのBSON ObjectIDは12バイトの値であり、4バイトのタイムスタンプ(紀元以来の秒数)、3バイトのマシンid、2バイトのプロセスid、および3バイトのカウント値を含む.注意BSONの他のフィールドとは異なり、タイムスタンプとカウント値フィールドはbig endianとして保存する必要があります.これは、それらをバイトで比較するため、ほとんどの場合、昇順であることを保証することを望んでいます.フォーマット:
0
1
2
3
4
5
6
7
8
9
10
11
time
machine
pid
inc
 
 
TimeStamp.これはunixスタイルのタイムスタンプです.1970年1月1日以降またはそれ以前の秒数を表す記号付き整数です.
Machine.これは、マシンホスト名hash(md 5)の後値、mac/networkアドレス、または仮想マシンidの最初の3バイトです.
pid.これは、プロセスが生成した2バイトのプロセスid(またはスレッドid)です.
increment.これは、自己付加価値または現在の言語/実行時にカウンタが使用できない場合のランダム値です.
BSON ObjectIdsは、任意の一意の12バイトバイナリ文字列であってもよい.ただし、サーバ自体とほとんどのドライバでは、上記のフォーマットが使用されています.
シーケンス番号
従来のデータベースでは、プライマリ・キーとして増分された順序番号が使用されることが多い.MongoDBでは、Object IDsを使用するのが好ましい.この概念は,非常に大きなクラスタにおいて,グローバルを維持するよりも,単調に成長するシーケンス番号を作成することが容易であるということである.
それでも、順番番号が必要な場合があります.「counter」ドキュメントを作成し、findAndModifyコマンドを使用することで、この目的を達成できます.
function counter(name) {
var ret = db.counters.findAndModify({query:{_id:name}, update:{$inc : {next:1}}, "new":true,
upsert:true});
// ret == { "_id" : "users", "next" : 1 }
return ret.next;
}
db.users.insert({_id:counter("users"), name:"Sarah C."}) // _id : 1
db.users.insert({_id:counter("users"), name:"Bob D."}) // _id : 2
//repeat

UUIDs
_idフィールドは任意のタイプであってもよい.しかし、唯一でなければなりません.これであなたは_idフィールドは、BSON ObjectIdsの代わりにUUIDsを使用する(BSON ObjectIdsは軽量である;グローバル一意を必要とせず、現在のデータベースクラスタのみであればよい).UUIDsを使用すると、アプリケーションは自分でUUIDを生成します.効率性を考慮すると、UUIDを[DOCS:BSON]タイプに格納するのが理想的です.空間と速度がこの時点で問題ではないことを知っていれば、どうしても16進数文字列として挿入することができます.