mongodbを使ってみる (5) - DBRef/DBPointerに関して -
更にドキュメントよみを進めてみる。今回はDBRefに関して
例えばドキュメントから別のドキュメントのデータを参照したい場合にどうするかって話なんですが、DBRefを使えば一応そういった事も出来る模様。言うよりやれ論でとりあえずやってみる
db.samples.tags.save({ name: "テスト" })
っていうのをやると_idが自動で付く。でその値は50f5370e85ac77daf3dd4bfbっていう感じになってるとする。でそれを別のデータから参照したい場合には
db.samples.entry.save({
name: "Test",
tag: new DBRef("samples.tags", ObjectId("50f5370e85ac77daf3dd4bfb"))
})
という感じでsaveする。んじゃとりあえずfindしてみると
{
"_id" : ObjectId("50f5379785ac77daf3dd4bfd"),
"name" : "Test",
"tag" : {
"$ref" : "samples.tags",
"$id" : ObjectId("50f5370e85ac77daf3dd4bfb")
}
}
っていう結果になる。まぁDBRefとしてsaveしなくても上記のように$refと$idを持つ連想配列型を作れば参照できる模様。で$ref自体はあくまでコレクションからの名前なので、今回db.samples.tagsっていうのを参照したいのでsamples.tagsで指定しなければならないような感じ。$idは言わなくてもわかるとおもうので(ry
んでもって
db.samples.entry.findOne().tag
// 出力: { "$ref" : "samples.tags", "$id" : ObjectId("50f5370e85ac77daf3dd4bfb") }
db.samples.entry.findOne().tag.fetch()
// 出力: { "_id" : ObjectId("50f5370e85ac77daf3dd4bfb"), "name" : "テスト" }
という感じで、データが参照しているデータを紐づけてフェッチする事が出来る模様。
でDBRefじゃなくてDBPointerっていうのもある模様
db.samples.entry.save({ name: "Test", tag: new DBPointer("samples.tags", ObjectId("50f5370e85ac77daf3dd4bfb") })
DBPointerってのを使うと
{
"ns": "samples.tags",
"id": ObjectId("50f5370e85ac77daf3dd4bfb")
}
っていうような形式になる模様。DBRefと同様な方式でフェッチ出来る模様