database reference

based on v45 (2010-10-02追従) - オリジナル

MongoDBはリレーショナルデータベスではないので(joinがない)、ドキュメント間の参照("外部キー")は、別のクエリをサーバに発行し、クライアントで行われます。MongoDBではこの参照のために2つの慣習があります。 一つは単純に手動で参照することです。もう一つは、 多くのドライバでサポートされているDBRefを使うことです。

注意: 組み込み(embed)オブジェクトは参照をする必要がありませんが、参照が好まれることもよくあります。

単純な参照

一般的に、コードで書かれた参照はそのまま動きます。 単純に、 他のドキュメントの _id を格納します。たとえば、

> p = db.postings.findOne(); 
{ 
"_id" : ObjectId("4b866f08234ae01d21d89604"), 
"author" : "jim", 
"title" : "Brewing Methods" 
} 
> // authorの情報を取得
> db.users.findOne( { _id : p.author } ) 
{ "_id" : "jim", "email" : "jim@gmail.com" } 

DBRef

DBRef は、ドキュメント間で参照を作るもっとフォーマルな方法です。 DBRefは(一般的に)、オブジェクトIDと共にコレクション名を持ちます。そのコレクション名がドキュメントによって変わる場合に使います。参照されるコレクションが常に同じ場合は、上述した手動での参照が効率的です。


DBRefは、一つのドキュメント(オブジェクト)から他のドキュメントへの参照です。一つのデータベース参照は、標準的な組み込み(JSON/BSON)オブジェクトです。慣習としての扱いで、特別な型があるわけではありません。普通の方法で持つことで、ドライバやデータフレームは、標準的な方法でこの参照を扱うためのヘルパーを追加することができます。

DBRefは、ドライバ側で クライアント側 での自動的に参照を展開できるという利点があります(他の機能が後で追加されるでしょう)。多くのケースで、 _id を参照として格納し、自分で参照を取得するという、上記 "単純な参照" セクションで記述したことをしなくてもよくなります。

DBRefの文法は次のようになります。

{ $ref : <collname>, $id : <idvalue>[, $db : <dbname>] } 

<collname> は参照されるコレクション名です(データベース名抜きの)。 <idvalue> は、 参照される側の _id フィールドの値です。 $db はオプショナルです(現在のところ多くのドライバでサポートされていません)。 ( <dbname> で指定した)データベース間の参照ができます。

DBRefでの引数の順番は大切です。上記のフィールドの順番通りに指定してください。

BSON での DBRef datatype は deprecated です。

異なる言語やドライバでの DBRef

C#

DBRef クラスを使ってください。コレクション名と _id をコンストラクタでパラメータとして取ります。そして、 DatabaseクラスFollowReference メソッドで参照されているドキュメントを取得できます。

C++

C++ドライバでは、自動的にDBRefを展開する機能は提供されていません。もちろんマニュアルではできます。

Java

Javaは、 DBRef class をでサポートしています。

Javascript (mongo shell)

例:

> x = { name : 'Biology' } 
{ "name" : "Biology" } 
> db.courses.save(x) 
> x 
{ "name" : "Biology", "_id" : ObjectId("4b0552b0f0da7d1eb6f126a1") } 
> stu = { name : 'Joe', classes : [ new DBRef('courses', x._id) ] } 
// またはこのように書けます: 
// stu = { name : 'Joe', classes : [ {$ref:'courses',$id:x._id} ] } 
> db.students.save(stu) 
> stu 
{ 
"name" : "Joe", 
"classes" : [ 
{ 
"$ref" : "courses", 
"$id" : ObjectId("4b0552b0f0da7d1eb6f126a1") 
} 
], 
"_id" : ObjectId("4b0552e4f0da7d1eb6f126a2") 
} 
> stu.classes[0] 
{ "$ref" : "courses", "$id" : ObjectId("4b0552b0f0da7d1eb6f126a1") } 
> stu.classes[0].fetch() 
{ "_id" : ObjectId("4b0552b0f0da7d1eb6f126a1"), "name" : "Biology" } 
> 

PHP

PHPは、DB参照を、 MongoDBRef class でサポートしています。また、データベースで作成/参照するためのメソッドがあります。
(MongoDB::createDBRefMongoDB::getDBRef) と (MongoCollection::createDBRef または、 MongoCollection::getDBRef) コレクションレベル。

Python

pythonで、DB参照を作るには、
pymongo.dbref.DBRef クラスを使います。 または、 dereference メソッドを使うこともできます。

Python はまた、自動的な参照と被参照(auto-refとauto-deref)もサポートしています。 auto_reference example を参照してください。

Ruby

Ruby もまた、DB参照を、 DBRef クラスでサポートしています。また、データベースインスタンスに対して、 dereference メソッドを使うこともでいます。例えば:

@db = Connection.new.db("blog") 
@user = @db["users"].save({:name => "Smith"}) 
@post = @db["posts"].save({:title => "Hello World", :user_id => @user.id}) 
@ref = DBRef.new("users", @post.user_id) 
assert_equal @user, @db.dereference(@ref) 

参照


Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.

IF YOU HAVE A QUESTION, POST IT TO THE USER GROUP.

These pages are fine for comments, but for questions, your best bet will always be the MongoDB User Group.

blog comments powered by Disqus