Я обновляю свой код из старого драйвера PHP MongoDB:
http://php.net/manual/en/class.mongoclient.php
Для нового драйвера MongoDB:
http://php.net/manual/en/set.mongodb.php
В предыдущей версии у меня было это:
$db->collection->find([
'$text' => [ '$search' => "stackoverflow" ]
],
[
'score' => [ '$meta' => 'textScore' ]
])->sort([ 'sort' => [ 'score' => [ '$meta' => 'textScore' ] ] ]);
В новой версии больше нет функции сортировки курсора, вы должны передать ее как опцию. Итак, новый код выглядит так:
$db->collection->find([
'$text' => [ '$search' => 'stackoverflow' ]
],
[
'score' => [ '$meta' => 'textScore' ],
'sort' => [ 'score' => [ '$meta' => 'textScore' ] ]
]);
Но я получаю ошибку:
«BadValue должен иметь проекцию $ meta для всех ключей сортировки $ meta»
Это потому, что прогнозирование результатов больше не происходит. Если вы просто удалите опцию сортировки и зарегистрируете результат, вы увидите, что в массиве результатов нет оценки. Об этом нет никакой документации.
Кто-нибудь знает, как решить эту проблему?
Спасибо
Если вы хотите выполнить поиск по текстовому индексу Монго и выполнить сортировку по полю textScore с новым драйвером PHP, вам нужно использовать класс Query, добавить свой фильтр и параметры, а затем выполнить их с помощью класса Manager. В вашем случае это будет примерно так:
$filter = [
'$text' => ['$search' => 'stackoverflow']];
$options = [
'projection' => [
'score' => ['$meta' => 'textScore']
],
'sort' => [
'score' => ['$meta' => 'textScore']
]
];
$mng = new MongoDB\Driver\Manager("mongodb://yourdbserver:27017");
$mongoQuery = new MongoDB\Driver\Query($filter, $options);
$cursor = $mng->executeQuery('db_name.collection_name', $mongoQuery);
Смотрите страницу документации для Класс запроса, первое примечание, кажется, действительно полезно.
Это тоже можно сделать так:
$collection = (new MongoDB\Client)->DB->COLLECTION;
$cursor = $collection->find(
['$text' => ['$search' => 'stackoverflow']],
[
'projection' => [
'score' => ['$meta' => 'textScore']
],
'sort' => [
'score' => ['$meta' => 'textScore']
]
]
);
И с пропуском и ограничением:
$collection = (new MongoDB\Client)->DB->COLLECTION;
$cursor = $collection->find(
['$text' => ['$search' => 'stackoverflow']],
['skip' => 0,
'limit' => 20,
'projection' => [
'score' => ['$meta' => 'textScore']
],
'sort' => [
'score' => ['$meta' => 'textScore']
]
]
);