Прогноз результатов полнотекстового поиска в новом драйвере MongoDB для переполнения стека

Я обновляю свой код из старого драйвера 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»

Это потому, что прогнозирование результатов больше не происходит. Если вы просто удалите опцию сортировки и зарегистрируете результат, вы увидите, что в массиве результатов нет оценки. Об этом нет никакой документации.

Кто-нибудь знает, как решить эту проблему?

Спасибо

0

Решение

Если вы хотите выполнить поиск по текстовому индексу Монго и выполнить сортировку по полю 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);

Смотрите страницу документации для Класс запроса, первое примечание, кажется, действительно полезно.

4

Другие решения

Это тоже можно сделать так:

$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']
]
]
);
0

По вопросам рекламы [email protected]