Можете да използвате тръбопровод за агрегиране за това
- Използвайте
$lookup
да се присъединят към двете колекции, $unwind
полученият масив от$lookup
етап$match
за да извършите търсенето с регулярен израз
Ако трябва да направите regex
търсене на title
на master
документ, можете да добавите това към вашия $or
заявка на $match
етап и ако не искате това, не забравяйте да премахнете от $or заявката (аз го добавих).
$pipeline = array(
array(
'$lookup' => array(
'from' => 'masters',
'localField' => '$master_id',
'foreignField' => '$_id',
'as' => 'master'
)
),
array(
'$unwind' => Array(
'path' => '$master',
'preserveNullAndEmptyArrays' => true
)
),
array(
'$match' => array(
'$or' => array(
array(
'title' => new \MongoDB\BSON\Regex($queryString),
),
array(
'description' => new \MongoDB\BSON\Regex($queryString),
),
array(
'master.title' => new \MongoDB\BSON\Regex($queryString),
),
)
)
),
array(
'$sort' => array(
'field_name' => 1
)
),
array(
'$limit' => 10
)
)
$results = $details->aggregate($pipeline);
Моят php не е толкова добър, но все пак успях да напиша заявката за вас. Моля, променете/променете кода според вашите нужди.
Работата е там, че ви дадох идея как да постигнете това. Надявам се, че това помага.
Редактиране
За sort
и limit
, използвайте $sort
и $limit
етапи на тръбопровод, добавих това в отговора.
Не забравяйте да замените field_name
с действителното поле, с което искате да сортирате резултата.