Vous pouvez utiliser le pipeline d'agrégation pour cela
- Utilisez
$lookup
pour joindre les deux collections, $unwind
le tableau résultant de$lookup
scène$match
pour faire la recherche de regex
Si vous avez besoin de faire la regex
rechercher sur title
de master
document également, vous pouvez l'ajouter à votre $or
requête du $match
étape, et si vous ne le souhaitez pas, n'oubliez pas de supprimer de la requête $or (je l'ai ajouté).
$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);
Maintenant, mon php n'est pas si génial, j'ai quand même réussi à écrire la requête pour vous. Veuillez changer/modifier le code en fonction de vos besoins.
Le fait est que je vous ai donné l'idée sur la façon d'y parvenir. J'espère que ça aide.
Modifier
Pour sort
, et limit
, utilisez $sort
et $limit
étapes du pipeline, j'ai ajouté cela dans la réponse.
N'oubliez pas de remplacer field_name
avec le champ réel avec lequel vous souhaitez trier le résultat.