通常のフィールド名ではなく、メタフィールドで並べ替えようとしています。
$collection->find()
の2番目の引数 クエリによって返される(する/しない)ドキュメントのフィールドを決定します。
これはSELECT *...
に似ています vs SELECT field1, field2 ...
SQLデータベースで。
現在、MongoDB 2.6には、ここで使用できる追加のキーワード$metaがあります。このキーワードを使用すると、フィールド名をリターンドキュメントに「挿入」できます(そうでない場合は実際には存在しません)。この挿入されたフィールド名の値は、実行しているドキュメントまたはクエリのある種の「メタデータ」から取得されます。
$ textクエリ演算子は、一致したドキュメントについてより多くの情報を利用できる演算子の例です。残念ながら、これを行うと予期しない方法でドキュメントが操作されるため、この追加情報について通知する方法はありません。ただし、メタデータはドキュメントに添付されます。メタデータが必要かどうかはユーザー次第です。
$ textオペレーターが作成するメタデータは、キーワード「textScore」を使用します。そのデータを含める場合は、選択したフィールド名にデータを割り当てることで含めることができます:
array("myFieldname" => array('$meta' => 'keyword'))
たとえば、$ text search(textScore)の場合、この配列を2番目の引数として$collection->find()
に渡すことで、フィールド名「score」をドキュメントに挿入できます。 :
array("score" => array('$meta' => 'textScore'))
これで、$text検索からの「textScore」値を持つ「score」というフィールドがリターンドキュメントに挿入されました。
ただし、これはまだドキュメントのメタデータであるため、クエリを実行する前に後続の操作でこの値を引き続き使用する場合は、$metaデータとして参照する必要があります。
つまり、フィールドで並べ替えるには、$metaプロジェクションで並べ替える必要があります
array('score' => array('$meta' => 'textScore'))
完全な例は次のようになります:
<?php
$mc = new MongoClient();
$collection = $mc->selectCollection("myDatabase", "myCollection");
$string = "search string";
$cursor = $collection->find(
array('$text' => array('$search' => $string)),
array('score' => array('$meta' => 'textScore'))
);
$cursor = $cursor->sort(
array('score' => array('$meta' => 'textScore'))
);
foreach($cursor as $document) {
var_dump($document);
}