|
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" }
DBRefDBRef は、ドキュメント間で参照を作るもっとフォーマルな方法です。 DBRefは(一般的に)、オブジェクトIDと共にコレクション名を持ちます。そのコレクション名がドキュメントによって変わる場合に使います。参照されるコレクションが常に同じ場合は、上述した手動での参照が効率的です。
DBRefは、ドライバ側で クライアント側 での自動的に参照を展開できるという利点があります(他の機能が後で追加されるでしょう)。多くのケースで、 _id を参照として格納し、自分で参照を取得するという、上記 "単純な参照" セクションで記述したことをしなくてもよくなります。 DBRefの文法は次のようになります。 { $ref : <collname>, $id : <idvalue>[, $db : <dbname>] }
<collname> は参照されるコレクション名です(データベース名抜きの)。 <idvalue> は、 参照される側の _id フィールドの値です。 $db はオプショナルです(現在のところ多くのドライバでサポートされていません)。 ( <dbname> で指定した)データベース間の参照ができます。
BSON での DBRef datatype は deprecated です。 異なる言語やドライバでの DBRefC#DBRef クラスを使ってください。コレクション名と _id をコンストラクタでパラメータとして取ります。そして、 DatabaseクラスFollowReference メソッドで参照されているドキュメントを取得できます。 C++C++ドライバでは、自動的にDBRefを展開する機能は提供されていません。もちろんマニュアルではできます。 JavaJavaは、 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" }
>
PHPPHPは、DB参照を、 MongoDBRef class でサポートしています。また、データベースで作成/参照するためのメソッドがあります。 Pythonpythonで、DB参照を作るには、 Python はまた、自動的な参照と被参照(auto-refとauto-deref)もサポートしています。 auto_reference example を参照してください。 RubyRuby もまた、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) 参照 |

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