Sie können dafür die Aggregationspipeline verwenden
- Verwenden Sie
$lookup
um die beiden Sammlungen zu verbinden, $unwind
das resultierende Array von$lookup
Stufe$match
um die Regex-Suche durchzuführen
Wenn Sie den regex
ausführen müssen Suche nach title
von master
Dokument ebenfalls, Sie können dies zu Ihrem $or
hinzufügen Abfrage des $match
Stufe, und wenn Sie das nicht wollen, vergessen Sie nicht, es aus der $or-Abfrage zu entfernen (ich habe es hinzugefügt).
$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);
Nun, mein PHP ist nicht so toll, trotzdem habe ich es geschafft, die Abfrage für Sie zu schreiben. Bitte ändern/modifizieren Sie den Code nach Bedarf.
Die Sache ist, dass ich Ihnen die Idee gegeben habe, wie Sie dies erreichen können. Hoffe das hilft.
Bearbeiten
Zum sort
, und limit
, verwenden Sie $sort
und $limit
Pipeline-Stufen, das habe ich als Antwort hinzugefügt.
Vergessen Sie nicht, field_name
zu ersetzen mit dem tatsächlichen Feld, nach dem Sie das Ergebnis sortieren möchten.