दिलचस्प पोस्ट
6 फरवरी 2013 से 'फीड' कनेक्शन के माध्यम से ग्राफ एपीआई के साथ मित्रों की दीवार पर पोस्टिंग मैं जावा में दो सूचियों में कैसे शामिल हूं? JSF कन्वर्टडेटटाइम पिछले दिन रेंडर करता है jQuery: पृष्ठ लोड पर कुछ एंकर / डिवेल पर स्क्रॉल कैसे करें? मैं किसी दिए गए निर्देशिका में फ़ाइलों पर कैसे पुनरावृत्त करूं? क्या अस्थायी आवधिक संकलक नहीं है? जावा में BigDecimal का वर्गमूल क्यों नहीं बिट-शिफ्ट, "<<", 32-बिट इंटिजर्स 32 से अधिक बार इस्तेमाल करते समय अपेक्षित काम करते हैं? क्या अधिक समझ में आता है – चार * स्ट्रिंग या चार * स्ट्रिंग? डेटाटामप्लेट से अभिमुख डेटाकॉन्टेक्ट एक्सेस करें जावास्क्रिप्ट / jQuery का उपयोग कर फ़ाइल डाउनलोड करें यदि कोई एनजीएसआरसी पथ 404 में हल करता है, तो क्या किसी डिफ़ॉल्ट पर फ़ॉलबैक का तरीका है? सूचीबैक्स को पॉप्युलेट करने के लिए मैं सभी देशों / शहरों की सूची कहां प्राप्त कर सकता हूं? JavaScript का उपयोग करके DOM तत्वों का एक सेट लपेट रहा है क्यों पीएक्स के बजाय उन्हें?

ऑब्जेक्टआईडी के सरणी में $ देखने

फ़ील्ड पर $ लुकअप करने के लिए सिंटैक्स क्या है, जो ऑब्जेक्टआईडीज़ की एक सरणी है, जो कि केवल एक ऑब्जेक्ट आईडी के बजाय है?

उदाहरण ऑर्डर दस्तावेज़:

{ _id: ObjectId("..."), products: [ ObjectId("..<Car ObjectId>.."), ObjectId("..<Bike ObjectId>..") ] } 

कार्य नहीं करना प्रश्न:

 db.orders.aggregate([ { $lookup: { from: "products", localField: "products", foreignField: "_id", as: "productObjects" } } ]) 

वांछित परिणाम

 { _id: ObjectId("..."), products: [ ObjectId("..<Car ObjectId>.."), ObjectId("..<Bike ObjectId>..") ], productObjects: [ {<Car Object>}, {<Bike Object>} ], } 

वेब के समाधान से एकत्रित समाधान "ऑब्जेक्टआईडी के सरणी में $ देखने"

$lookup एकत्रीकरण पाइपलाइन चरण सीधे एक सरणी के साथ काम नहीं करेगा। डिजाइन का मुख्य उद्देश्य संभवतः संबंधित डेटा पर "एक से बहुत से" प्रकार के जुड़ने (या वास्तव में "लुकअप") के रूप में "बाएं जुड़ने" के लिए है लेकिन मूल्य एकमात्र और एक सरणी नहीं है।

इसलिए आपको काम करने के लिए $lookup ऑपरेशन करने से पहले सामग्री को "डी-सामान्य" करना चाहिए। और इसका अर्थ है कि $unwind का उपयोग करें:

 db.orders.aggregate([ // Unwind the source { "$unwind": "$products" }, // Do the lookup matching { "$lookup": { "from": "products", "localField": "products", "foreignField": "_id", "as": "productObjects" }}, // Unwind the result arrays ( likely one or none ) { "$unwind": "$productObjects" }, // Group back to arrays { "$group": { "_id": "$_id", "products": { "$push": "$products" }, "productObjects": { "$push": "$productObjects" } }} ]) 

$lookup बाद प्रत्येक सरणी सदस्य से मेल खाता है, परिणाम एक सरणी ही होता है, इसलिए आप $unwind पुनः खोलें और $group को अंतिम परिणाम के लिए नए एरेज़ को $push

ध्यान दें कि कोई भी "बायां जोड़ी" मैचों जो मिले नहीं हैं, दिए गए उत्पाद पर "उत्पाद ऑब्जेक्ट्स" के लिए एक खाली ऐरे बनाते हैं और इस प्रकार "उत्पाद" तत्व के लिए दस्तावेज़ को नकार $unwind जब दूसरे $unwind कहा जाता है

हालांकि एक सरणी के लिए एक सीधा आवेदन अच्छा होगा, यह संभव है कि यह वर्तमान में एक विलक्षण मूल्य से संभावित कई लोगों तक मिलान करके काम करता है।

चूंकि $lookup मूल रूप से बहुत ही नया है, यह वर्तमान में काम करता है, जो उन लोगों से परिचित होंगे जो मोंगोज़ से परिचित हैं। वहां की पेशकश की विधि के "खराब मनुष्य संस्करण" के रूप में। यह अंतर यह है कि $lookup ग्राहक के विरोध में "शामिल होने" के "सर्वर साइड" प्रोसेसिंग की पेशकश करता है और $lookup में "परिपक्वता" में से कुछ वर्तमान में क्या है। .populate() ऑफ़र (जैसे लुकअप सरणी पर सीधे)

यह वास्तव में सुधार सर्वर -22881 के लिए एक असाइन किया गया मुद्दा है, इसलिए कुछ किस्मत के साथ यह अगले रिलीज पर या एक के बाद जल्द ही मारा जाएगा।

एक डिजाइन सिद्धांत के रूप में, आपकी वर्तमान संरचना अच्छा या बुरी न हो, लेकिन किसी भी "जॉइन" बनाने के दौरान केवल ओवरहेड्स के अधीन। जैसे, स्थापना के समय में MongoDB के बुनियादी खड़े सिद्धांत लागू होता है, जहां आप एक संग्रह में "पहले से जुड़े" डेटा के साथ जी रहे हैं, तो ऐसा करना सबसे अच्छा है।

एक सामान्य बात यह है कि एक सामान्य सिद्धांत के रूप में $lookup में कहा जा सकता है, यहां बताया गया है कि यहां "शामिल होने" का इरादा यहां दिखाया गया है कि यहां पर अन्य तरीकों से काम करना है। इसलिए "अभिभावक" दस्तावेज के भीतर अन्य दस्तावेजों के "संबंधित आईडी" को बनाए रखने के बजाय, सामान्य सिद्धांत जो सबसे अच्छा काम करता है वह है जहां "संबंधित दस्तावेज़" में "अभिभावक" के संदर्भ होते हैं

तो $lookup को "रिलेशन डिज़ाइन" के साथ "सबसे अच्छा काम" करने के लिए कहा जा सकता है जो कि इसके विपरीत है कि कैसे मोंगोज़ जैसे कुछ। .populate() करता है यह ग्राहक की ओर से जुड़ता है। इसके बजाय प्रत्येक "बहुत से" में "एक" को पहचानकर, आप संबंधित वस्तुओं में $unwind ज़रूरत के बिना पहले सरणी को खोलने की ज़रूरत करते हैं।

$lookup एकत्रीकरण पाइपलाइन चरण अब एक सरणी के साथ सीधे काम करता है (3.3.4 संस्करण पर)

देखें: लोकल (बहु) मूल्यों और विदेशी (एकल) मूल्य के बीच लुकअप

$ का उपयोग करें खोलना आपको ऑब्जेक्ट की सरणी के बजाय पहला ऑब्जेक्ट मिलेगा

क्वेरी:

 db.getCollection('vehicles').aggregate([ { $match: { status: "AVAILABLE", vehicleTypeId: { $in: Array.from(newSet(d.vehicleTypeIds)) } } }, { $lookup: { from: "servicelocations", localField: "locationId", foreignField: "serviceLocationId", as: "locations" } }, { $unwind: "$locations" } ]); 

परिणाम:

 { "_id" : ObjectId("59c3983a647101ec58ddcf90"), "vehicleId" : "45680", "regionId" : 1.0, "vehicleTypeId" : "10TONBOX", "locationId" : "100", "description" : "Isuzu/2003-10 Ton/Box", "deviceId" : "", "earliestStart" : 36000.0, "latestArrival" : 54000.0, "status" : "AVAILABLE", "accountId" : 1.0, "locations" : { "_id" : ObjectId("59c3afeab7799c90ebb3291f"), "serviceLocationId" : "100", "regionId" : 1.0, "zoneId" : "DXBZONE1", "description" : "Masafi Park Al Quoz", "locationPriority" : 1.0, "accountTypeId" : 0.0, "locationType" : "DEPOT", "location" : { "makani" : "", "lat" : 25.123091, "lng" : 55.21082 }, "deliveryDays" : "MTWRFSU", "timeWindow" : { "timeWindowTypeId" : "1" }, "address1" : "", "address2" : "", "phone" : "", "city" : "", "county" : "", "state" : "", "country" : "", "zipcode" : "", "imageUrl" : "", "contact" : { "name" : "", "email" : "" }, "status" : "", "createdBy" : "", "updatedBy" : "", "updateDate" : "", "accountId" : 1.0, "serviceTimeTypeId" : "1" } } { "_id" : ObjectId("59c3983a647101ec58ddcf91"), "vehicleId" : "81765", "regionId" : 1.0, "vehicleTypeId" : "10TONBOX", "locationId" : "100", "description" : "Hino/2004-10 Ton/Box", "deviceId" : "", "earliestStart" : 36000.0, "latestArrival" : 54000.0, "status" : "AVAILABLE", "accountId" : 1.0, "locations" : { "_id" : ObjectId("59c3afeab7799c90ebb3291f"), "serviceLocationId" : "100", "regionId" : 1.0, "zoneId" : "DXBZONE1", "description" : "Masafi Park Al Quoz", "locationPriority" : 1.0, "accountTypeId" : 0.0, "locationType" : "DEPOT", "location" : { "makani" : "", "lat" : 25.123091, "lng" : 55.21082 }, "deliveryDays" : "MTWRFSU", "timeWindow" : { "timeWindowTypeId" : "1" }, "address1" : "", "address2" : "", "phone" : "", "city" : "", "county" : "", "state" : "", "country" : "", "zipcode" : "", "imageUrl" : "", "contact" : { "name" : "", "email" : "" }, "status" : "", "createdBy" : "", "updatedBy" : "", "updateDate" : "", "accountId" : 1.0, "serviceTimeTypeId" : "1" } } 

$lookup और बाद के $group साथ समेकित करना काफी जटिल है, इसलिए यदि आप नोड और मोंगोज़ या एक सहायक लाइब्रेरी का प्रयोग स्कीमा में कुछ संकेतों के साथ कर रहे हैं, तो आप उन लोगों को लाने के लिए .populate() का उपयोग कर सकते हैं दस्तावेज:

 var mongoose = require("mongoose"), Schema = mongoose.Schema; var productSchema = Schema({ ... }); var orderSchema = Schema({ _id : Number, products: [ { type: Schema.Types.ObjectId, ref: "Product" } ] }); var Product = mongoose.model("Product", productSchema); var Order = mongoose.model("Order", orderSchema); ... Order .find(...) .populate("products") ...