2013-12-11 9 views
6

मैं फार्म के दस्तावेजों:

{ 
    _id : ObjectId(.....), 
    prop1 : "foo", 
    links : [ 1, 2, 3, 4 ] 
} 

{ 
    _id : ObjectId(.....), 
    prop1 : "bar", 
    links : [ 5, 6, 7, 8 ] 
} 

मैं एकत्रीकरण ढांचे का उपयोग कर रहा इन दस्तावेजों पर कार्रवाई करने के, मैं $ का प्रयोग कर एक उत्पन्न करने के लिए तनाव कम लिंक सरणी में प्रत्येक मान के लिए दस्तावेज़।

लेकिन मेरे पास तीन मामले हैं जहां मुझे $ खोलने से पहले दस्तावेज़ों को अपडेट करने की आवश्यकता है, मैं $ प्रोजेक्ट ऑपरेशन देख रहा हूं, लेकिन मुझे निम्नलिखित मामलों के लिए एरे बनाने या अपडेट करने के बारे में कोई जानकारी नहीं मिल सकती है।

1) लिंक संपत्ति

{ 
    _id : ObjectId(.....), 
    prop1 : "far" 
} 

याद आ रही है मैं) लिंक सरणी

2 सम्मिलित करने के लिए लिंक सरणी संपत्ति एक खाली सरणी

{ 
    _id : ObjectId(.....), 
    prop1 : "far", 
    links : [] 
} 

मैं डालने की आवश्यकता है की जरूरत है सरणी में एक मान

3) लिंक सरणी में बहुत कम मान हैं

{ 
    _id : ObjectId(.....), 
    prop1 : "far", 
    links : [ 9, 10 ] 
} 

मैं सरणी

+1

मैं सशर्त रूप से मूल्य जोड़ने के लिए '$ cond' देखता हूं: http://docs.mongodb.org/manual/reference/operator/aggregation/cond/ – WiredPrairie

+0

मैं $ cond से परिचित हूं, समस्या मेरे पास यह है कि मैं वास्तव में सरणी बनाने या सरणी मानों को अद्यतन करने का तरीका नहीं समझ सकता। मैंने इसे बेहतर ढंग से प्रतिबिंबित करने के लिए प्रश्न को अद्यतन किया है। – user2808819

+0

आप वास्तव में दस्तावेज़ों को स्थायी रूप से संशोधित नहीं कर सकते हैं। यह केवल पाइपलाइन के दौरान होगा कि आप किसी फ़ील्ड के मान को संशोधित कर सकते हैं। – WiredPrairie

उत्तर

2

आप का उपयोग करने के लिए सक्षम होना चाहिए में अतिरिक्त मान डालने की आवश्यकता $isNull (reference):

db.test.aggregate({ $project : { the_links: { $ifNull : ["$links" , [5,6]]}} }) 

यह सरल तर्क है कि अगर संदर्भित क्षेत्र ($links) है कि शून्य, प्रतिस्थापन मूल्य (इस मामले में [5, 6]) का उपयोग किया जाता है। उदाहरण के लिए मैंने फ़ील्ड का नाम बदलकर the_links कर दिया।

links फ़ील्ड मानना ​​शून्य (और खाली सरणी नहीं है)। यह देखते हुए डेटा की तरह:

{ "_id" : ObjectId(...), "prop1" : "foo", "links" : [ 1, 2, 3, 4 ] } 
{ "_id" : ObjectId(...), "prop1" : "bar" } 

एकत्रीकरण ऊपर का उत्पादन:

db.test.aggregate({ $project : 
    { the_links: { $cond : [ { $eq : ["$links", []]}, '$links', [5,6]]}} }) 

लेकिन, अगर:

{ 
    "result" : [ 
      { 
        "_id" : ObjectId("52a869d51d02442354276cff"), 
        "the_links" : [ 
          1, 
          2, 
          3, 
          4 
        ] 
      }, 
      { 
        "_id" : ObjectId("52a869e31d02442354276d00"), 
        "the_links" : [ 
          5, 
          6 
        ] 
      } 
    ], 
    "ok" : 1 
} 

तो लिंक null से एक खाली सरणी [] थे बल्कि, आप की तरह कुछ कर सकता है यह या तो शून्य या [] है, तो आपको 01 के भीतर $or के रूप में उस स्थिति के लिए अतिरिक्त चेक जोड़ने की आवश्यकता होगीऑपरेटर।

यदि सूची में मूल्य हैं, और आप सशर्त रूप से अधिक मूल्य जोड़ना चाहते हैं, तो वर्तमान (2.4.x) उत्पादन मोंगोडीबी के निर्माण का कोई प्रभावी समाधान नहीं है। विकास शाखा में एक ऑपरेटर है जिसे $size कहा जाता है जो एक सरणी (jira) की लंबाई लौटाएगा। इसके बाद आप सशर्त उन्हें अभी तक एक और विकास सुविधा कहते हैं $ setUnion का उपयोग कर जोड़ सकते हैं:

$ setUnion सरणियों के किसी भी संख्या ले जाता है और एक सरणी कि तत्वों है कि किसी भी इनपुट सरणी में प्रदर्शित होने वाले देता है।

+0

ऐसा लगता है कि यह मामलों 1 और 2 के लिए काम करेगा, 3 मामले पर कोई विचार है, जहां मुझे मौजूदा सरणी में मूल्य जोड़ने की आवश्यकता है। मैं mongo 2.6 के लिए परिवर्तनों को देख रहा हूं और एक $ नक्शा फ़ंक्शन है जिसे किसी सरणी में प्रत्येक प्रविष्टि पर लागू किया जा सकता है लेकिन ऐसा नहीं लगता है कि यह मुझे सरणी में मान डालने देगा। – user2808819

+0

वास्तव में 2.6 में नए सेट ऑपरेटर को देखा, $ setUnion किसी भी संख्या में सरणी लेगा और उनमें से संघ उत्पन्न करेगा। मैं नए मानों को नए सरणी प्रॉपर्टी में जोड़ने के लिए $ प्रोजेक्ट का उपयोग करने में सक्षम हो सकता हूं और फिर उन्हें मर्ज करने के लिए $ setUnion, या यहां तक ​​कि एक अक्षर के रूप में एक शाब्दिक सरणी का उपयोग भी कर सकता हूं। मुझे 2.6 डाउनलोड करना होगा और इसे आज़माएं। – user2808819

+0

क्या आप समझा सकते हैं कि आप क्या करने की कोशिश कर रहे हैं? आप सरणी में मान जोड़ने की कोशिश क्यों कर रहे हैं? मैंने भावी संस्करण समर्थन के बारे में कुछ विवरण जोड़े। – WiredPrairie

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