(PECL mongo >=0.9.0)
MongoCollection::ensureIndex — 指定したフィールドにインデックスを作成する (すでに存在する場合は何もしない)
そのフィールドを持たないドキュメントが複数ある場合は、 そこに一意なインデックスを作成することはできません。 フィールドが存在しないときは事実上そのフィールドは NULL ということになり、それが複数存在すると既に一意ではなくなっているからです。
インデックスとして使用するフィールド。
このパラメータは array("optionname" => <boolean>, ...) 形式の連想配列で、現在サポートしているオプションは次の通りです。
"unique"
一意なインデックスを作ります。
"dropDups"
一意なインデックスを作ったときに重複する値が存在すれば、 ひとつを除いてその他すべてを削除します。
"background"
MongoDB バージョン 1.3.2 以降を使っている場合は、 他の操作をしながらバックグラウンドでインデックスを作ることができます。 デフォルトでは、インデックスの作成を同期処理で行います。 このオプションを TRUE にすると、インデックスの作成が非同期で行われます。
"safe"
ドライバのバージョン 1.0.4 以降では、 インデックスの作成に成功したかどうかを確認できるようになりました。 このオプションを指定すると、インデックスの作成に失敗したときに MongoCursorException をスローします。
"name"
ドライバの 1.0.4 より後のバージョン (1.0.4 は含みません) では、インデックスの名前を指定できます。 これは、多くのキーを作ろうとして Mongo にインデックス名が長くなりすぎると言われた場合などに有用です。
TRUE を返します。
バージョン | 説明 |
---|---|
1.0.2 | "options" パラメータが boolean から配列に変わりました。 1.0.2 より前のバージョンでは二番目のパラメータはオプションの boolean 値で、一意なインデックスを指定するものでした。 |
例1 MongoCollection::ensureIndex() の例
<?php
$c = new MongoCollection($db, 'foo');
// 'x' の昇順にインデックスを作成します
$c->ensureIndex(array('x' => 1));
// 'z' の昇順、'zz' の降順にインデックスを作成します
$c->ensureIndex(array('z' => 1, 'zz' => -1));
// 'x' に一意なインデックスを作成します
$c->ensureIndex(array('x' => 1), array("unique" => true));
?>
例2 重複を削除する例
<?php
$collection->insert(array("username" => "joeschmoe"));
$collection->insert(array("username" => "joeschmoe"));
/*
* インデックスの作成に失敗します。重複する値があるキーに
* 一意なインデックスを作ることはできません。
*/
$collection->ensureIndex(array("username" => 1), array("unique" => 1));
/*
* インデックスの作成に成功します。ドキュメントのひとつがコレクションから削除されます。
*/
$collection->ensureIndex(array("username" => 1), array("unique" => 1, "dropDups" => 1));
/*
* 一意なインデックスができたあとは、同じユーザ名を
* このように追加しようとしても失敗します。
*/
$collection->insert(array("username" => "joeschmoe"));
?>
例3 地理空間のインデックス
Mongo は地理空間のインデックスをサポートしています。 これを使うと、指定した場所のそば、あるいは図形の範囲内にあるドキュメントを探すことができます。 たとえば、"loc" フィールドに地理空間のインデックスを作るには次のようにします。
<?php
$collection->ensureIndex(array("loc" => "2d"));
?>
MongoDB コアドキュメントの » vanilla indexes および » geospatial indexes を参照ください。