MongoCollection::ensureIndex
(PECL mongo >=0.9.0)
MongoCollection::ensureIndex —
指定したフィールドが存在しない場合にインデックスを作成する
説明
public bool MongoCollection::ensureIndex
( string|array $key|keys
[, array $options
= array()
] )
コレクション上の指定されたフィールドが存在しない場合に、インデックスを作成します。
フィールドのインデックスは、方向 (昇順あるいは降順) で指定するか、
あるいは特定の型 (text, geospatial, hashed) で指定できます。
注意:
このメソッドは、MongoDB 2.6 以降との通信の際には、データベースコマンド
» createIndexes
を使います。それ以前のバージョンのデータベースでは、特別なコレクション
system.indexes 上での insert 操作を実行します。
パラメータ
-
keys
-
インデックスをソートするフィールドの配列。配列の各要素のキーがフィールド名、
値には、方向あるいは » index type.
を指定します。方向を指定する場合は、昇順なら 1、降順なら
-1 と指定します。
-
options
-
インデックス作成操作についてのオプションの配列。
現在利用可能なオプションは、以下のとおりです。
"unique"
TRUE
を指定すると、一意なインデックスを作ります。デフォルト値は FALSE
です。このオプションを使えるのは、昇順もしくは降順のインデックスだけです。
注意:
MongoDB がフィールドをインデックスするとき、もしそのフィールドに値を含まないドキュメントがあれば、NULL
値をインデックスします。このフィールドを含まないドキュメントが複数あった場合、一意なインデックスは、最初に出現したドキュメント以外を受け付けません。これを防ぐには "sparse" オプションを使います。このオプションを指定すれば、インデックス対象のフィールドが存在しないドキュメントはインデックスしなくなります。
"sparse"
TRUE
を指定すると、疎なインデックスを作ります。これは、指定したフィールドを含むドキュメントだけをインデックスします。デフォルト値は FALSE
です。
"expireAfterSeconds"
このオプションの値に指定するのは、ドキュメントを有効期限切れとみなしてコレクションから自動削除するまでの秒数です。このオプションが使えるのは、単一フィールドインデックスで、フィールドに MongoDate の値を含む場合のみです。
注意:
この機能が使えるのは、MongoDB 2.2 以降です。詳細は » Expire Data from Collections by Setting TTL を参照ください。
"name"
オプションの、インデックスを一意に特定するための名前。
注意:
ドライバーがデフォルトで生成するインデックス名は、インデックスのフィールドと、並び順あるいは型に基づくものです。たとえば、複合インデックス array("x" => 1, "y" => -1) の名前は "x_1_y_-1" であり、地理空間インデックス array("loc" => "2dsphere") の名前は "loc_2dsphere" となります。多数のフィールドからなるインデックスの場合、自動生成される名前が MongoDB の » インデックス名の制限 を超えてしまう可能性があります。"name" オプションは、そんな場合に短い名前を用意するときなどに使えます。
"background"
Builds the index in the background so that building an index does not block other database activities. Specify TRUE
to build in the background. The default value is FALSE
.
警告Prior to MongoDB 2.6.0, index builds on secondaries were executed as foreground operations, irrespective of this option. See » Building Indexes with Replica Sets for more information.
"socketTimeoutMS"
このオプションは、ソケット通信の制限時間を、ミリ秒単位で指定します。この時間内にサーバーからの反応がなければ、MongoCursorTimeoutException をスローします。この場合、サーバー側で書き込み処理が行われたのかどうかを判断できなくなります。-1 を指定すると、永遠にブロックします。MongoClient のデフォルト値は 30000 (30 秒) です。
以下のオプションは、MongoDB 2.6 以降で使えます。
以下のオプションは、MongoDB 2.8 より前のバージョンで使えます。
以下のオプションは、MongoDB 2.6 より前のバージョンで使えます。
以下のオプションは廃止予定です。使ってはいけません。
"safe"
非推奨。write concern の w オプションを使いましょう。
"timeout"
非推奨。"socketTimeoutMS" のエイリアス。
"wtimeout"
廃止予定。"wTimeoutMS" のエイリアスです。
返り値
インデックスの作成状況を含む配列を返します。
作成に成功したかどうか ("ok")、
作成前と作成後のインデックス数
("numIndexesBefore" および
"numIndexesAfter")、
そのインデックスが属するコレクションを作成したかどうか
("createdCollectionAutomatically")
が含まれます。
インデックスが既に存在していて作成の必要がない場合は、
"numIndexesAfter" に代わって
"note" フィールドが含まれます。
MongoDB 2.4 以前のバージョンでは、
書き込み確認 が少なくとも
1 以上である場合は、ステータスを表すドキュメントを返します。
それ以外の場合は TRUE
を返します。
ステータスを表すドキュメントのフィールドは場合によって異なりますが、
"ok" フィールドは常に存在し、インデックスの作成に成功したかどうかを示します。
その他のフィールドについては
MongoCollection::insert() のドキュメントを参照ください。
例
例1 MongoCollection::ensureIndex() の例
<?php
$c = new MongoCollection($db, 'foo');
// 'x' の昇順にインデックスを作成します
$c->ensureIndex(array('x' => 1));
// 'y' に一意なインデックスを作成します
$c->ensureIndex(array('y' => 1), array('unique' => true));
// 'za' の昇順、'zb' の降順に複合インデックスを作成します
$c->ensureIndex(array('za' => 1, 'zb' => -1));
?>
例2 地理空間のインデックス
Mongo は地理空間のインデックスをサポートしています。
これを使うと、指定した場所のそば、あるいは図形の範囲内にあるドキュメントを探すことができます。
たとえば、"loc" フィールドに地理空間のインデックスを作るには次のようにします。
<?php
$collection->ensureIndex(array('loc' => '2dsphere'));
?>
例3 重複を削除する例
<?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'));
?>