sql >> データベース >  >> NoSQL >> MongoDB

LaravelとMongoDBを使用して結合されたコレクションを照合する方法は?

    rawを実行できます Aggregate()を使用したクエリ $ lookupを使用できます ここで「結合」を実行する演算子:

      $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 )
         ));
      });
    

    $ lookup 指定された'localField'に「none」以上の一致するエントリを含むターゲットフィールドの「配列」を返します value(s)、ここで、それは単数または値の配列のいずれかです。通常、 ObjectIdを使用します ここで、特に'foreignField'にリンクする場合 _idとして 。

    これは、クライアント側で実行できるものよりも優れています。他の操作では、コレクションソースごとにデータベースに対して複数のクエリを実行する必要があるためです。 $ lookup これは、単一の要求と応答で実行されます。

    唯一の注意点は、これはORM / ODMとは「別」であるため、クラスやモデルの名前ではなく、実際の「コレクション名」を指定する必要があるということです。だから私は"users"を推測しているだけです ここでは、ユーザーのコレクションに合わせて調整する必要があるかもしれません。 実際に呼び出されます。

    とにかく、「結合された」データを取得したら、 $ match "usrEmail"で 結合されたデータのプロパティを取得し、クエリに含めます。

    実際のクエリについては、基本的に$またはを実行しているためです。 両方のコレクションのデータ全体の条件は、実際には $ match 結合が実行される「後」まで。

    そしてもちろん、 $skip および $ limit あなたのページネーションにも。




    1. マングース:CastError:パス「_id」の値「me」のObjectIdへのキャストに失敗しました

    2. C#を介してMongoDBのストアドプロシージャを呼び出す

    3. マルチキーインデックスの低速範囲クエリ

    4. TypeError:「in」演算子を使用して男性の「_id」を検索することはできません