MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie kann man mit Laravel und MongoDB auf verbundene Sammlungen abgleichen?

Sie können ein raw erstellen Abfrage mit aggregate() die den $lookup verwenden können Operator, um den "Join" hier zu bewirken:

  $result = Booking::raw(function($collection) use($search, $start, $limit) {
     return $collection->aggregate(array(
       array( '$lookup' => array(
         'from' => 'users',
         'localField' => 'user',
         'foreignField' => '_id',
         'as' => 'user'
       )),
       array( '$unwind' => array( 
         'path' => '$user', 'preserveNullAndEmptyArrays' => True
       )),
       array( '$match' => array(
         '$or' => array(
           array( 'invoice_number' => array( '$regex' => $search ) ),
           array( 'payment_type' => array( '$regex' => $search ) ),
           array( 'txid' => array( '$regex' => $search ) ),
           array( 'user.usrEmail' => array( '$regex' => $search ) )
         )
       )),
       array( '$skip' => $start ),
       array( '$limit' => $limit )
     ));
  });

Der $lookup gibt ein "Array" für das Zielfeld zurück, das "keine" oder mehr übereinstimmende Einträge zum angegebenen 'localField' enthält value(s), wobei dies entweder ein Singular oder ein Array von Werten ist. Normalerweise verwenden wir ObjectId hier, insbesondere bei der Verlinkung auf das 'foreignField' als _id .

Dies ist besser als alles, was clientseitig durchgeführt werden kann, da jede andere Operation mehrere Abfragen an die Datenbank für jede Sammlungsquelle erfordern würde. $lookup tut dies in einer einzigen Anfrage und Antwort.

Der einzige wirkliche Hinweis ist, dass Sie, da dies vom ORM/ODM "getrennt" ist, den tatsächlichen "Sammlungsnamen" und nicht den der Klasse oder des Modells angeben müssen. Ich gehe also nur von "users" aus hier, aber Sie müssen dies möglicherweise an Ihre Sammlung für Users anpassen heißt eigentlich.

Wie auch immer, nachdem Sie die "verbundenen" Daten haben, können Sie $match auf "usrEmail" -Eigenschaft aus den zusammengeführten Daten und schließen Sie sie in Ihre Abfrage ein.

Was die eigentliche Abfrage betrifft, da Sie im Grunde einen $or ausführen Bedingung für Daten aus beiden Sammlungen können wir nicht wirklich $match bis "nachdem" die Verknüpfung durchgeführt wird.

Dann gibt es natürlich die Aggregationsstufen für $skip und $limit auch für deine Paginierung.