PHP / MongoDB — агрегация $ concat

У меня есть следующая функция:

public function cmd(Array $cmd){
if ($this->ready_to_act()){
$comando = [
'aggregate' => $this->collection,
'pipeline' => [
[
'$concat'=>[
'final_value'=>[
'$first',
' ',
'$last'
]
]
],
[
'$match'=>[
'final_value'=> new MongoDB\BSON\Regex("/$texto/",'gi')
]
]
]
];
$command = new MongoDB\Driver\Command($cmd);
return $this->link
->executeCommand($this->database,$command);
}else{
throw new MongoDB\Driver\Exception\InvalidArgumentException("No hay base de datos/coleccion definida!");
die();
}
}

Я пытаюсь запустить команду, которая первый а также прошлой «колонна», и проверьте, если окончательное значение как $ Texto.

Но что-то не так. В документации PHP нет ничего о $ concat.

Нераспознанное имя этапа конвейера: ‘concat’

Я не знаю что делать, что я делаю неправильно

Для меня не разрешено использовать Composer.

0

Решение

Неправильный водитель

Как уже отмечалось, вы используете неправильный драйвер для начала. Итак, самое первое, что нужно сделать, это установить правильный драйвер как документированный. Если вы все еще не уверены, какой драйвер какой, то есть это страница на php.net с диаграммой, объясняющей все это.

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

Правильный трубопровод

Основная ошибка бросается, хотя это потому, что $concat это не «стадия трубопровода». Это оператор для использования внутри этапов конвейера, таких как $project или же $addFields, вот как вы хотели использовать его в этом контексте:

$pipeline = [
[ '$addFields' => [
'final_value' => [
'$concat' => [ '$first', ' ', '$last' ]
]
]],
[ '$match'=>[
'final_value'=> new MongoDB\BSON\Regex("/$texto/",'gi')
]]
];

Это правильный способ определения конвейера. Если у вас нет $addFields (из MongoDB 3.2, которая действительно должна быть минимальная версия, которую вы уже установили Заметка ) тогда вы используете $project и определите «все» свойства документа, которые вы хотите получить дополнительно.

В качестве мелочи, если у вас есть MongoDB 3.4, то вы могли бы использовать $indexOfCP в пределах $redact Стадия трубопровода:

$pipeline = [
[ '$redact' => [
'$cond' => [
'if' => [
'$ne' => [
[ '$indexOfCP' => [
[ '$concat' => [ '$first', ' ', '$last' ] ],
$texto
]],
-1
]
],
'then' => '$$KEEP',
'else' => '$$PRUNE'
]
]]
];

Но я действительно не думаю, что вы должны делать это или исправленный конвейер агрегации, который вы пытались, так как есть гораздо лучший способ сделать это с MongoDB. И конечно pipeline выражения действительно должны быть выданы с помощью
MongoDB\Collection::aggregate() в правильном пространстве имен драйвера.

чередовать

Честно говоря, вы действительно должны использовать $text искать здесь вместо Это позволяет вам определить «текстовый указатель» над двумя полями, а затем вы можете просто ввести поисковый запрос для запроса.

Предполагая пространство имен базы данных "test" и коллекция с именем "collection"Вы можете создать индекс:

$collection = (new MongoDB\Client)->test->collection;
$indexName = $collection->createIndex(['first' => 'text', 'last' => 'text' ])

И затем выполните запрос:

$collection = (new MongoDB\Client)->test->collection;

$cursor = $collection->find([
'$text' => [ '$search' => $words_or_phrase ]
]);

foreach ($cursor as $document) {
var_dump($document);  # do something real here
}

Поэтому «запросу» не нужно знать, в каких свойствах искать, потому что они определяются при создании индекса. Вы можете просто ввести только «слова» имени, имя первое или последнее или оба, и совпадения будут возвращены, а также в порядке их соответствия, потому что именно так поступают текстовые поиски.

Однако, опять же, вам действительно нужно использовать правильный драйвер, который с радостью возвращает правильный курсор и поддерживает все дополнительные опции стандартным способом.

НОТА: Официальная поддержка версий MongoDB до 3.2 истекает с февраля 2018 года. См. Политика поддержки.

1

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector