MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Làm thế nào để So khớp trên các Bộ sưu tập đã tham gia bằng Laravel và MongoDB?

Bạn có thể thực hiện raw truy vấn với tổng hợp () có thể sử dụng $ lookup toán tử để thực hiện "tham gia" tại đây:

  $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 sẽ trả về một "mảng" cho trường đích chứa "không có" hoặc nhiều mục nhập phù hợp hơn với 'localField' được cung cấp (các) giá trị, trong đó giá trị đó là số ít hoặc là một mảng giá trị. Thông thường, chúng tôi sử dụng ObjectId tại đây, đặc biệt là khi liên kết đến 'ForeignField' dưới dạng _id .

Điều này tốt hơn bất kỳ điều gì có thể được thực hiện ở phía máy khách, vì bất kỳ hoạt động nào khác sẽ yêu cầu thực hiện nhiều truy vấn đến cơ sở dữ liệu cho mỗi nguồn thu thập. $ lookup thực hiện điều này trong một yêu cầu và phản hồi duy nhất.

Lưu ý thực sự duy nhất là vì đây là "tách biệt" với ORM / ODM, bạn cần chỉ định "tên bộ sưu tập" thực tế chứ không phải của lớp hoặc mô hình. Vì vậy, tôi chỉ giả định là "người dùng" ở đây, nhưng bạn có thể cần phải điều chỉnh điều đó cho phù hợp với những gì bộ sưu tập của bạn dành cho Người dùng thực sự được gọi là.

Nhưng dù sao đi nữa, sau khi bạn có dữ liệu "đã kết hợp" thì bạn có thể $ match trên "usrEmail" từ dữ liệu đã kết hợp và đưa vào truy vấn của bạn.

Đối với truy vấn thực tế, vì về cơ bản bạn đang thực hiện $ hoặc điều kiện trên dữ liệu từ cả hai bộ sưu tập, chúng tôi thực sự không thể $ match cho đến khi "sau khi" tham gia được thực hiện.

Sau đó, tất nhiên có các giai đoạn tổng hợp cho $ bỏ qua $ limit cho việc phân trang của bạn.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Trong pymongo của MongoDB, làm cách nào để đếm ()?

  2. Cách truy xuất tệp hình ảnh từ mongodb sang trang html

  3. Tìm kiếm Toàn văn trong MongoDB không mang lại kết quả mong đợi cho @@@

  4. Cách ghi mảng kết hợp trống ({}) sang MongoDB từ PHP

  5. Phân tích cú pháp một chuỗi truy vấn dài trực tiếp tới MongoDB (giống như bạn có thể làm trong SQL)