2015-02-26 3 views
5

मैं निम्नलिखित कोडमैं मोंगो डीबी एकत्रीकरण परिणामों को मौजूदा संग्रह में कैसे जोड़ूं?

db.dados_meteo.aggregate([ 
        { $match : { "POM" : "AguiardaBeira" } }, 
        { $project : { 
        _id : { $concat: [ 
         "0001:", 
         { $substr: [ "$DTM", 0, 4 ] }, 
         { $substr: [ "$DTM", 5, 2 ] }, 
         { $substr: [ "$DTM", 8, 2 ] }, 
         { $substr: [ "$DTM", 11, 2 ] }, 
         { $substr: [ "$DTM", 14, 2 ] }, 
         { $substr: [ "$DTM", 17, 2 ] } 
         ] }, 
        "RNF" : 1, "WET":1,"HMD":1,"TMP":1 } }, 
        { $out : "dados_meteo_reloaded" } 
       ]) 

लेकिन हर बार मैं $ मैच पैरामीटर बदल का उपयोग कर एक विद्यमान मोंगो डीबी संग्रह पर कई सम्मिलन करते हैं और एक नया एकत्रीकरण बनाने के लिए कोशिश कर रहा हूँ, मोंगो डीबी पिछले दस्तावेजों को हटा देता है और सम्मिलित करता है नया परिणाम

क्या आप मेरी मदद कर सकते हैं?

+0

संभावित डुप्लिकेट [परिणाम को एकत्रित करने और परिणाम को कैसे मिलाएं?] (Https://stackoverflow.com/questions/20976569/how-to-aggregate-and-merge-the-result-into-a- संग्रह) – NatNgs

उत्तर

6

संक्षिप्त उत्तर है "आप नहीं कर सकते": संग्रह $ बाहर आपरेशन द्वारा निर्दिष्ट पहले से मौजूद है

, तो एकत्रीकरण के पूरा होने पर, $ बाहर चरण atomically मौजूदा बदल देता है नए परिणाम संग्रह के साथ संग्रह। $ आउट ऑपरेशन पिछले संग्रह पर मौजूद किसी भी अनुक्रमणिका को नहीं बदलता है। यदि एकत्रीकरण विफल रहता है, तो $ आउट ऑपरेशन पूर्व-मौजूदा संग्रह में कोई बदलाव नहीं करता है।

    :

समाधान के लिए, आप संग्रह दस्तावेज़ $out द्वारा निर्दिष्ट एक "स्थायी" संग्रह करने के लिए सिर्फ एकत्रीकरण के बाद एक कई तरीके (गैर जिनमें से हालांकि आदर्श है) में से एक में कॉपी कर सकते हैं,

  • copyTo() सबसे आसान, चेतावनी दिमाग है। छोटे परिणामों के लिए अन्य का उपयोग न करें।
  • उपयोग जे एस: db.out.find().forEach(function(doc) {db.target.insert(doc)})
  • उपयोग mongoexport/mongoimport
  • +14

    विश्वास नहीं कर सकता कि उनके पास शामिल करने का कोई तरीका नहीं है। और यह एक डीबी है जिसमें लाखों फंडिंग हैं? दयनीय। – foreyez

    +1

    ओर, आपका उत्तर अच्छा दिखता है। हो सकता है कि आप इसे संपादित करना चाहते हैं और यह विकल्प http://stackoverflow.com/a/37433640/2834978 जोड़ना चाहते हैं। db.col1.insert (db.col2.aggregate (...)। toArray()) –

    1

    यह नहीं सुंदर बात कभी, लेकिन एक और विकल्प वाक्य रचना (एक पोस्ट-प्रोसेसिंग संग्रह/आपरेशन संलग्न से) के रूप में ...

    db.targetCollection.insertMany(db.runCommand(
     
    { 
     
        aggregate: "sourceCollection", 
     
        pipeline: 
     
        [ 
     
         { $skip: 0 }, 
     
         { $limit: 5 }, 
     
         { 
     
          $project: 
     
          { 
     
           myObject: "$$ROOT", 
     
           processedDate: { $add: [new ISODate(), 0] } 
     
          } 
     
         } 
     
        ] 
     
    }).result)

    मुझे यकीन है कि कैसे इस foreach संस्करण के खिलाफ को पीछे छोड़ देता नहीं हूँ, लेकिन मैं फाई और इसे पढ़ने के लिए और अधिक सहज ज्ञान युक्त।

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