Полнотекстовый поиск и сортировка php mongodb

i nead, чтобы выполнить поиск с полным текстовым индексом, и этот код работает:

$cursor=$collection->find(array('$text'=>(array('$search'=>$s))), array("score"=> array('$meta'=>"textScore")) ); 

Я пытаюсь сортировать курсор с помощью:

 $cursor =$cursor->sort(array("score"=>1)); 

когда я пытаюсь читать

 var_dump($cursor->getNext()); 

я дал мне эту ошибку. Не удалось исключить «MongoCursorException» с сообщением «localhost: 27017: Can canicalize query: BadValue не может иметь не-мета-сортировку без метаданных в мета-проекции»,

Есть идеи?

Вы пытаетесь сортировать мета-поле, а не обычное имя поля.

Второй аргумент в $collection->find() определяет, какие поля документа, которые вы (do / do not) хотите вернуть запросу.

Это похоже на SELECT *... vs SELECT field1, field2 ... в SQL-базах данных.

Теперь в MongoDB 2.6 имеется дополнительное ключевое слово, которое вы можете использовать здесь, $ meta . Это ключевое слово позволяет вам «вводить» имена полей в возвращаемый документ (который иначе вообще не существовал бы). Значение этого введенного имени поля будет получено из каких-то «метаданных» документа или запроса, который вы выполняете.

Оператор $ text query является примером оператора, который имеет больше информации о согласованном документе. К сожалению, он не может сообщить вам об этой дополнительной информации, так как это приведет к неожиданному обращению с вашим документом. Однако он прикрепляет метаданные к документу, и вам решать, нужно ли вам это или нет.

Метаданные, создаваемые текстовым оператором, используют ключевое слово "textScore". Если вы хотите включить эти данные, вы можете сделать это, присвоив ему имя поля по вашему выбору:

 array("myFieldname" => array('$meta' => 'keyword')) 

Например, в случае текстового поиска (textScore) мы можем ввести имя поля «score» в наш документ, передав этот массив в качестве второго аргумента в $collection->find() :

 array("score" => array('$meta' => 'textScore')) 

Теперь мы ввели поле, называемое «оценка», в наш возвратный документ, который имеет значение «textScore» из текстового поиска $.

Но поскольку это все еще только метаданные документа, если вы хотите продолжать использовать это значение в любых последующих операциях перед выполнением запроса, вам все равно придется ссылаться на него как на метаданные.

Это означает, что для сортировки на поле вам нужно сортировать по $ 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); }