2017-05-06 6 views
6

या तो सी #/लिंक या यहां तक ​​कि कच्चे मोंगोब के साथ समझने की कोशिश कर रहा है कि कार्टियर उत्पाद के रूप में कई सरणी कैसे जुड़ें।सी # मल्टीडब कार्टेशियन उत्पाद एकाधिक ऑब्जेक्ट सरणी दस्तावेज़ों

उदाहरण के लिए

कहते हैं कि मैं एक संग्रह है कि मैं निम्नलिखित दो दस्तावेज़ों के लिए नीचे फ़िल्टर्ड था:

[ 
{"movie":"starwars","showday":"monday"}, 
{"movie":"batman","showday":"thursday"}, 
{"movie":"sleepless","showday":"tuesday"} 
] 

[ 
{"actor":"angelina","location":"new york"}, 
{"actor":"jamie","location":"california"}, 
{"actor":"mcavoy","location":"arizona"} 
] 

कैसे मैं एक सरणी परिणाम निम्न प्रकार के निर्माण करने के लिए प्रत्येक आइटम शामिल हो सकते हैं?

[{"movie":"starwars","showday":"monday","actor":"angelina","location":"new york"}, 
{"movie":"batman","showday":"thursday","actor":"angelina","location":"new york"}, 
{"movie":"sleepless","showday":"tuesday","actor":"angelina","location":"new york"}, 
{"movie":"starwars","showday":"monday","actor":"jamie","location":"california"}, 
{"movie":"batman","showday":"thursday","actor":"jamie","location":"california"}, 
{"movie":"sleepless","showday":"tuesday","actor":"jamie","location":"california"}, 
{"movie":"starwars","showday":"monday","actor":"mcavoy","location":"arizona"}, 
{"movie":"batman","showday":"thursday","actor":"mcavoy","location":"arizona"}, 
{"movie":"sleepless","showday":"tuesday","actor":"mcavoy","location":"arizona"}] 

मैं ऐसे समाधान की तलाश में हूं जो किसी भी दस्तावेज़ के साथ काम कर सके। तो उदाहरण के लिए यदि इस उदाहरण में एक तीसरा दस्तावेज़ था जिसमें 3 ऑब्जेक्ट एरे भी थे जो सरणी में 27 आइटमों के परिणाम सेट का उत्पादन करेंगे - या 27 पंक्तियों के रूप में।

सी # (लिंक?) मोंगोडब चालक का उपयोग करने के समाधान के लिए उम्मीद करते हुए इस तरह के डेटा को पूछने और वापस करने के लिए, लेकिन यहां तक ​​कि एक mongodb विशिष्ट क्वेरी के लिए भी खुलेगा क्योंकि मैं आशा करता हूं कि मैं वहां से तर्क को उलट कर सकता हूं। धन्यवाद

+0

क्या आपके दो अलग-अलग संग्रह हैं या आप एक संग्रह को पुन: सक्रिय करना चाहते हैं।और क्या आप और अधिक चाहते हैं कि आप क्या चाहते हैं और आपने – Yogesh

+0

की कोशिश की है, मेरे पास वास्तव में सवाल है, आपका मॉडल '{[फिल्में], [अभिनेता]} क्यों नहीं है और 'मूवी {मूवी, शोडे, [अभिनेता]}' मुझे माफ़ कर दो यह विषय – Munzer

+1

है क्योंकि डेटा में कोई संबंध नहीं है, इसलिए "डेटाबेस" स्वयं ऐसा नहीं कर सकता है। मोंगोडीबी एक आरडीबीएमएस की तरह नहीं है जहां मनमाने ढंग से कई स्रोतों से डेटा खींचना और उस पर कार्यात्मक आउटपुट चलाने के लिए संभव होगा। असल में सभी ऑपरेशन एक समय में एक संग्रह पर हैं, '$ लुकअप' के अपवाद के साथ, और उन ऑपरेटरों को संबंधित कुंजी की आवश्यकता होगी। आप इसे कोड में करते हैं, या सर्वर पर कोड चलाने के लिए '.eval()' का उपयोग करते हैं। लेकिन ** डॉन ** 'eval()' का उपयोग करें। तो यह एक कोडिंग व्यायाम है और डेटाबेस समाधान नहीं है। –

उत्तर

3

आप एकत्रीकरण पाइपलाइन से नीचे आज़मा सकते हैं।

नोट mergeObjects एग्रीगेशन ऑपरेटर 3.5.6 + विकास रिलीज में उपलब्ध है जो आने वाले 3.6 रिलीज में लॉन्च किया जाएगा।

db.collection.find(); 
{ 
"data" : [ 
    [ 
    { 
    "movie" : "starwars", 
    "showday" : "monday" 
    }, 
    { 
    "movie" : "batman", 
    "showday" : "thursday" 
    }, 
    { 
    "movie" : "sleepless", 
    "showday" : "tuesday" 
    } 
    ], 
    [ 
    { 
    "actor" : "angelina", 
    "location" : "new york" 
    }, 
    { 
    "actor" : "jamie", 
    "location" : "california" 
    }, 
    { 
    "actor" : "mcavoy", 
    "location" : "arizona" 
    } 
    ] 
] 
} 

सशर्त अभिव्यक्ति का उपयोग करके एकत्रीकरण।

aggregate({ 
$project: { 
    cp: { 
    $reduce: { 
    input: "$data", 
    initialValue: { 
    $arrayElemAt: ["$data", 0] // Set the initial value to the first element of the arrays. 
    }, 
    in: { 
    $let: { 
     vars: { 
     currentr: "$$this", // Current processing element 
     currenta: "$$value" // Current accumulated value 
     }, 
     in: { 
     $cond: [{ // Conditional expression to return the accumulated value as initial value for first element 
     $eq: ["$$currentr", "$$currenta"] 
     }, 
     "$$currenta", 
     { // From second element onwards prepare the cartesian product 
     $reduce: { 
     input: { 
      $map: { 
      input: "$$currenta", 
      as: a"a", 
      in: { 
      $map: { 
      input: "$$currentr", 
      as: r"r", 
      in: { 
       $mergeObjects: ["$$a", "$$r"] // Merge accumulated value with the current processing element 
      } 
      } 
      } 
      } 
     }, 
     initialValue: [], 
     in: { 
     $concatArrays: ["$$value", "$$this"] // Reduce the merged values which will be used as accumulator for next element 
     } 
     } 
     }] 
     } 
    } 
    } 
    } 
    } 
} 
}); 

एकत्रीकरण ($setUnion का उपयोग करके)।

यह समाधान केवल पढ़ने योग्य पाइपलाइन देने के लिए सशर्त अभिव्यक्ति को दबाने के लिए जोड़ा गया था।

aggregate({ 
$project: { 
    cp: { 
    $reduce: { 
    input: "$data", 
    initialValue: { 
    $arrayElemAt: ["$data", 0] // Set the initial value to the first element of the arrays. 
    }, 
    in: { 
    $let: { 
     vars: { 
     currentr: "$$this", // Current processing element 
     currenta: "$$value" // Current accumulated value 
     }, 
     in:{ 
     $reduce: { 
     input: { 
     $map: { 
      input: "$$currenta", 
      as: "a", 
      in: { 
      $map: { 
      input: "$$currentr", 
      as: "r", 
      in: { 
      $mergeObjects: ["$$a", "$$r"] // Merge accumulated value with the current processing element 
      } 
      } 
      } 
     } 
     }, 
     initialValue: [], 
     in: { 
     $setUnion: ["$$value", "$$this"] // Reduce the merged values which will be used as accumulator for next element 
     } 
     } 
     } 
    } 
    } 
    } 
    } 
} 
}); 

अद्यतन

उपरोक्त दोनों समाधान के रूप में एशिया KAMSKY के गलत $cond पहले समाधान में और $setUnion दूसरा समाधान में की वजह से नीचे टिप्पणी द्वारा नोट सरणियों भर में मान दोहरा साथ काम नहीं करेंगे।

सही ठीक input: {$slice:["$data", 1, {$subtract:[{$size:"$data"},1]}]},

पूरा एकत्रीकरण पाइप लाइन की तरह पहला तत्व को बाहर करने के लिए [ { } ]

या

परिवर्तन input की initialValue साथ

शुरुआत है

aggregate({ 
$project: { 
    cp: { 
    $reduce: { 
    input: {$slice:["$data", 1, {$subtract:[{$size:"$data"},1]}]}, 
    initialValue: {$arrayElemAt:["$data",0]}, 
    in: { 
    $let: { 
     vars: { 
     currentr: "$$this", 
     currenta: "$$value" 
     }, 
     in:{ 
     $reduce: { 
     input: { 
     $map: { 
      input: "$$currenta", 
      as: "a", 
      in: { 
      $map: { 
      input: "$$currentr", 
      as: "r", 
      in: { 
      $mergeObjects: ["$$a", "$$r"] 
      } 
      } 
      } 
     } 
     }, 
     initialValue: [], 
     in: { 
     $concatArrays: ["$$value", "$$this"] 
     } 
     } 
     } 
    } 
    } 
    } 
    } 
} 
}); 

संदर्भ: Cartesian product of multiple arrays in JavaScript

+0

यह तब काम नहीं करता है जब किसी भी फ़ील्ड में एरे –

+0

@AsyaKamsky हां में दोहराया जाने वाला कोई मान है जो 100% सही है। मुझे इसके बारे में पता था लेकिन सशर्त अभिव्यक्ति को बदलने के लिए कुछ भी नहीं मिला। मैंने पिछले संशोधन को भी जोड़ा है जो मुझे विश्वास है कि सही था। – Veeram

+0

नहीं, यदि आपने तत्वों को दोहराया है तो यह सही तरीके से काम नहीं करता है। –

संबंधित मुद्दे