Intereting Posts
Создание пользовательских «html» -tags для CMS? Невозможно отправить уведомление группе с помощью кнопки уведомления, даже если это возможно через regId Шифрование и расшифровка текста с помощью RSA в PHP $ _POST не передает никаких переменных Перенаправление на исходную страницу после входа в систему (Codeigniter) Как передать переменную SESSION на страницу в родительском каталоге? CodeIgniter: как передавать значения из определенной функции в другую Укладка нескольких тернарных операторов в PHP CURL post request работает, тогда как PHP (Magento) Varien_Http_Client не Как получить show_error () в CodeIgniter для загрузки представления? Как запретить пользователю использовать «источник просмотра», чтобы посмотреть на мой PHP-код и скопировать его? Вопросы безопасности AJAX Работает среда Symfony2, среда prod дает ошибку 404 Как установить расширение PHP 7 «memcached» в Windows sudo pecl установить ошибку apc на os x lion

Полнотекстовый поиск и сортировка 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); }