mongodbガイド(14)-developer zone-データ型と約束(3)のデータベース参照

4194 ワード

mongodbは非関係型(joinなし)であるため、ドキュメント間の参照(「外部キー」)は、通常、クライアントがサーバに追加のクエリーを行うことによって解決される(linking).
これらの接続は常にクライアントで解決されます.直接/手動で行うのは簡単で、お勧めです.
ここには、linkingの概念をある程度抽象化した多くの駆動がサポートされているDBRefメカニズムもあります.推奨方法は、直接/手動linkを使用することです.
埋め込みオブジェクトはlinkingの代替案であり、非常に適切で優れている場合が多い.
簡単なダイレクト/手動linking
通常、linkソリューションを手動で作成すると、作業が容易になり、簡単になります.ストレージ_idの値はデータベースの他のドキュメントに渡され、後でクエリーされます.例:
> // grab a random blog post:
> p = db.postings.findOne();
{
"_id" : ObjectId("4b866f08234ae01d21d89604"),
"author" : "jim",
"title" : "Brewing Methods"
}
> // get more info on author of post p. this is the "linking" step.
> a = db.users.findOne( { _id : p.author } )
{ "_id" : "jim", "email" : "[email protected]" }
> // inverse: given an author, find all blog posts for the author
> db.postings.find( {author : a._id } )

DBRef
DBRefは、ドキュメント間参照を作成するより正式な仕様です.DBRefs(通常)は、オブジェクトidに加えてセット名を含む.ほとんどの開発者は,ドキュメント内の集合が他のものに変更できる場合にのみDBRefを使用する.参照のセットが常に同じである場合、上記の手動参照はより効率的です.
DBRefは、同じデータベース内の1つのドキュメントから別のドキュメントへの参照です.データベース参照は標準的な埋め込み(JSON/BSON)オブジェクトです.特別なタイプではありません.標準メソッドを使用して表現することで、ドライバとデータフレームワークは、標準メソッドに従って参照を操作するアシスタントメソッドを追加できます.
いくつかの駆動においてDBRefには、オプションの原子間クライアントが参照を解くことを可能にする利点がある.多くのシーンでは、_idは参照として格納され、前の「単純手動参照」章で述べたように解参照されます.
DBRef参照値の構文は次のとおりです.
{ $ref : <collname>, $id : <idvalue>[, $db : <dbname>] }

は参照される集合名(データベース名なし)、は参照オブジェクトのフィールドです.idの値.$dbはオプションです(現在、ほとんどのドライバはサポートされていません)、参照可能なドキュメントは他のデータベースです(で指定).
 
異なる言語/ドライバのDBRef
C#
DBRefクラスを使用します.コンストラクション関数のパラメータは集合名と_です.id.次に、DatabaseクラスのFollowReferenceメソッドを使用して参照ドキュメントを取得できます.
C++
c++駆動はDBRefsを自動的に巡回する方法を提供していない.もちろん手動で完成することができます.
Java
JAvaはDBRefクラスを使用してDB参照をサポートします.
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) ] }
// or we could write:
// 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" }
>

Perl
perlドライバはDBRefsを自動的に巡回する方法を提供していないが、CPANパッケージ:MongoDBx::AutoDerefがある.もちろん、手動で彼らを巡ることもできます.
PHP
PHPは、データベースレベル(MongoDB::createDBRefおよびMongoDB::getDBRef)および集合レベル(MongoCollection::createDBRefおよびMongoCollection::getDBRef)の作成および解凍参照方法に加えて、DB参照をサポートするためにMongoDBRefクラスを提供する.
Python
pythonでbsonを使用する.dbref.DBRefクラスを使用して、DBリファレンスを作成します.また、Databaseインスタンスのdereferenceメソッドを使用して、参照の解除を容易にすることもできます.
Ruby
RubyもDBRefクラスとDBインスタンスのdereferenceメソッドを使用してDB参照をサポートします.例:
@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)