mongodbを使ってみる (5) - DBRef/DBPointerに関して -

2013-01-16T00:00:00+00:00 MongoDB

更にドキュメントよみを進めてみる。今回は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と同様な方式でフェッチ出来る模様

mongodbを使ってみる (6) - findAndModify - mongodbを使ってみる (3) - インデックスに関して -