配列やオブジェクトもデータベースに格納することができます。
数値添字の配列は配列として、
それ以外のものはすべてオブジェクトとして格納されます。
<?php
// $scores は配列として格納されます
$scores = array(98, 100, 73, 85);
$collection->insert(array("scores" => $scores));
// $scores はオブジェクトとして格納されます
$scores = array("quiz1" => 98, "midterm" => 100, "quiz2" => 73, "final" => 85);
$collection->insert(array("scores" => $scores));
?>
> db.students.find()
{ "_id" : ObjectId("4b06beada9ad6390dab17c43"), "scores" : [ 98, 100, 73, 85 ] }
{ "_id" : ObjectId("4b06bebea9ad6390dab17c44"), "scores" : { "quiz1" : 98, "midterm" : 100, "quiz2" : 73, "final" : 85 } }
任意の PHP オブジェクトもデータベースに格納することができます
(返されるときは連想配列となります)。
フィールドは キー/値 のペアに使います。
たとえば、blogへの投稿を表す次のようなオブジェクトを考えましょう。
<?php
// blog投稿クラス
class Post {
var $author;
var $content;
var $comments = array();
var $date;
public function __construct($author, $content) {
$this->author = $author;
$this->content = $content;
$this->date = new MongoDate();
}
public function setTitle($title) {
$this->title = $title;
}
}
// 単純なblog投稿を作り、データベースに追加します
$post1 = new Post("Adam", "This is a blog post");
$blog->insert($post1);
// "author" フィールドの型には何も制約がないので、
// オブジェクトをネストさせることができます
$author = array("name" => "Fred", "karma" => 42);
$post2 = new Post($author, "This is another blog post.");
// タイトルを設定して、別のフィールドを追加することができます
$post2->setTitle("Second Post");
$blog->insert($post2);
?>
> db.blog.find()
{ "_id" : ObjectId("4b06c263edb87a281e09dad8"), "author" : "Adam", "content" : "This is a blog post", "comments" : [ ], "date" : "Fri Nov 20 2009 11:22:59 GMT-0500 (EST)" }
{ "_id" : ObjectId("4b06c282edb87a281e09dad9"), "author" : { "name" : "Fred", "karma" : 42 }, "content" : "This is a blog post", "comments" : [ ], "date" : "Fri Nov 20 2009 11:23:30 GMT-0500 (EST)", "title" : "Second Post" }
<?php
$collection->insert($GLOBALS);
?>
Fatal error: Nesting level too deep - recursive dependency?
再帰構造になる可能性のあるドキュメントを追加しなければならない場合は、
ドライバに渡す前に自分でチェックしておかなければなりません。