追加されたすべてのオブジェクトには、一意な _id フィールドが自動的に付加されます。 これは、問い合わせで使うフィールドとして便利です。
今追加したばかりのドキュメントを探すことを考えてみましょう。 追加するとドキュメントに _id フィールドができるので、それを問い合わせればいいのです。
<?php
$person = array("name" => "joe");
$people->insert($person);
// $joe には _id フィールドがあります
$joe = $people->findOne(array("_id" => $person['_id']));
?>
ユーザが別途指定しない限り、_id フィールドは MongoId となります。ありがちな間違いは、 文字列を MongoId とマッチさせようとすることです。 文字列とは別の型であり、そのままではマッチしないことを覚えておきましょう。 これは、文字列 "array()" と空の配列が別のものであるというのと同じことです。 次の例を参照ください。
<?php
$person = array("name" => "joe");
$people->insert($person);
// _id を文字列に変換します
$pid = $person['_id'] . "";
// 失敗 - $pid は文字列であり、MongoId ではありません
$joe = $people->findOne(array("_id" => $pid));
?>
配列には特殊な点がいくつかあります。 まず、MongoDB が扱う配列には二種類あります。 "普通の" 配列と連想配列です。連想配列には、任意の型のキーと値を組み合わせることができます。 "普通の" 配列は、0 から始まってひとつずつ増えていく数値のインデックスに それぞれ要素を関連づけます。 これらは、ほぼ PHP の配列や連想配列と同じようなものです。
たとえば、受賞の一覧をドキュメントに保存するときには次のようにできます。
<?php
$collection->save(array("awards" => array("gold", "silver", "bronze")));
?>
問い合わせでは、配列の要素も探すことができます。 指定した値が配列の要素に含まれるすべてのドキュメントを探すことを考えましょう。 たとえば、受賞 (awards) に金賞 (gold) が含まれる次のようなドキュメントです。
{ "_id" : ObjectId("4b06c282edb87a281e09dad9"), "awards" : ["gold", "silver", "bronze"]}
これは、単純なクエリで問い合わせることができます。"awards" が配列であるということを気にせず、次のようにすればいいのです。
<?php
$cursor = $collection->find(array("awards" => "gold"));
?>
もう少し複雑なオブジェクトを考えてみましょう。 配列の各要素のオブジェクトになっている、次のような例だとどうでしょう。
{ "_id" : ObjectId("4b06c282edb87a281e09dad9"), "awards" : [ { "first place" : "gold" }, { "second place" : "silver" }, { "third place" : "bronze" } ] }
このような場合でも、配列であることを特別視する必要はありません。 内部のオブジェクトへの問い合わせには、ドット記法が使えます。
<?php
$cursor = $collection->find(array("awards.first place" => "gold"));
?>
フィールド名にスペースが含まれていてもかまわないことに注目しましょう (スペースを使わないにこしたことはありませんが、可読性を考慮しました)。
配列を使って、取り得る値を複数指定した問い合わせを行うこともできます。 "gold" あるいは "copper" を含むドキュメントを探すには、このようにします。
<?php
$cursor = $collection->find(array("awards" => array('$in' => array("gold", "copper"))));
?>