2010-08-12 12 views
6

मुझे पता है कि इस सवाल से पहले पूछा गया है, लेकिन यह एक अलग परिदृश्य है। मैं इस तरह एक संग्रह है करना चाहते हैं:क्या एक प्रश्न के साथ सूची को अपरिवर्तित करने का कोई तरीका है?

{ 
    "_id" : ObjectId("4c28f62cbf8544c60506f11d"), 
    "pk": 1, 
    "forums": [{ 
     "pk": 1, 
     "thread_count": 10, 
     "post_count": 20, 
    }, { 
     "pk": 2, 
     "thread_count": 5, 
     "post_count": 24, 
    }] 
} 

मुझे क्या करना चाहते हैं एक "मंच" आइटम Upsert करने, काउंटर incrementing या अगर यह मौजूद नहीं है एक आइटम जोड़ने है।

उदाहरण (मुझे आशा है कि यह समझ में आता है) इस तरह कुछ करने के लिए के लिए:

db.mycollection.update({ 
    "pk": 3, 
    "forums.pk": 2 
}, { 
    "$inc": {"forums.$.thread_count": 1}, 
    "$inc": {"forums.$.post_count": 1}, 
}, true) 

और है:

    :

    { 
        "_id" : ObjectId("4c28f62cbf8544c60506f11d"), 
        "pk": 1, 
        "forums": [{ 
         "pk": 1, 
         "thread_count": 10, 
         "post_count": 20, 
        }, { 
         "pk": 2, 
         "thread_count": 5, 
         "post_count": 24, 
        }] 
    }, 
    { 
        "_id" : ObjectId("4c28f62cbf8544c60506f11e"), 
        "pk": 3, 
        "forums": [{ 
         "pk": 2, 
         "thread_count": 1, 
         "post_count": 1, 
        }] 
    } 
    

    मैं निश्चित रूप से यह तीन चरणों में कर सकते हैं

  1. पूरे संग्रह को एक नए आइटम के साथ उपरोक्त करें
  2. फ़ोरम आइटम जोड़ें

    db.mycollection.update({pk:3}, {pk:3}, true) 
    db.mycollection.update({pk:3}, {$addToSet: {forums: {pk:2}}}) 
    db.mycollection.update({pk:3, 'forums.pk': 2}, {$inc: {'forums.$.thread_counter': 1, {'forums.$.post_counter': 1}}) 
    

    आप यह करने के लिए एक अधिक कुशल तरीका के बारे में पता कर रहे हैं: सूची

  3. स्थितीय ऑपरेटर

कहना है कि साथ

  • वेतन वृद्धि मंच आइटम काउंटरों के लिए? TIA, Germano

  • उत्तर

    10

    आप की खोज की है हो सकता है, positional operator upserts में उपयोग नहीं किया जा सकता है:

    स्थितीय ऑपरेटर एक upsert के साथ संयुक्त नहीं किया जा सकता क्योंकि यह एक मिलान सरणी तत्व की आवश्यकता है। यदि आपके अपडेट को सम्मिलित करने के परिणामस्वरूप "$" का शाब्दिक रूप से फ़ील्ड नाम के रूप में उपयोग किया जाएगा।

    तो आप एक ही प्रश्न में वांछित परिणाम प्राप्त करने में सक्षम नहीं होंगे।

    काउंटर अपडेट से दस्तावेज़ के निर्माण को अलग करने के लिए है। आपका स्वयं का समाधान सही रास्ते पर है। इसे निम्नलिखित दो प्रश्नों में संकुचित किया जा सकता है:

    // optionally create the document, including the array 
    db.mycollection.update({pk:3}, {$addToSet: {forums: {pk:2}}}, true) 
    
    // update the counters in the array item 
    db.mycollection.update({pk:3, 'forums.pk': 2}, {$inc: {'forums.$.thread_counter': 1, 'forums.$.post_counter': 1}}) 
    
    +0

    हाँ, मैंने इसे समझ लिया। फिर भी धन्यवाद। – Germano

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

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