आप एक कच्चा
कर सकते हैं कुल ()
. के साथ क्वेरी जो $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'
में "कोई नहीं" या अधिक मिलान वाली प्रविष्टियों वाले लक्ष्य फ़ील्ड के लिए एक "सरणी" लौटाएगा value(s), जहां वह या तो एकवचन या मानों की एक सरणी है। आमतौर पर हम ObjectId
. का उपयोग करते हैं यहां, विशेष रूप से 'विदेशी क्षेत्र'
. से लिंक करते समय _id
. के रूप में ।
यह क्लाइंट की ओर से की जा सकने वाली किसी भी चीज़ से बेहतर है, क्योंकि किसी भी अन्य ऑपरेशन के लिए प्रत्येक संग्रह स्रोत के लिए डेटाबेस में कई प्रश्न करने की आवश्यकता होगी। $lookup
यह एक ही अनुरोध और प्रतिक्रिया में करता है।
एकमात्र वास्तविक नोट यह है कि क्योंकि यह ओआरएम/ओडीएम से "अलग" है, आपको वास्तविक "संग्रह नाम" निर्दिष्ट करने की आवश्यकता है, न कि कक्षा या मॉडल का। तो मैं बस मान रहा हूँ "users"
यहां, लेकिन आपको इसे उपयोगकर्ताओं
. के लिए अपने संग्रह के अनुसार समायोजित करने की आवश्यकता हो सकती है वास्तव में कहा जाता है।
वैसे भी, आपके पास "शामिल" डेटा होने के बाद आप कर सकते हैं $मैच
"usrEmail"
. पर सम्मिलित डेटा से संपत्ति, और अपनी क्वेरी में शामिल करें।
वास्तविक क्वेरी के लिए, चूंकि आप मूल रूप से एक $या
. कर रहे हैं दोनों संग्रहों के डेटा की स्थिति हम वास्तव में $matchनहीं कर सकते कोड>
शामिल होने के "बाद" तक।
फिर निश्चित रूप से $skip
के लिए एकत्रीकरण चरण हैं। कोड>
और $limit
आपके पेजिनेशन के लिए भी।