2013-07-02 10 views
5

ओवरराइट किए बिना नया डेटा अपडेट करूँ, तो कहें कि मैंने एक बाल्टी के नीचे कुछ रिकॉर्ड/दस्तावेज़ बनाए हैं और उपयोगकर्ता आरडीबीएमएस में 10 में से केवल एक कॉलम अपडेट करता है, इसलिए मैं कोशिश कर रहा हूं केवल एक कॉलम डेटा भेजने और इसे सोफेबेस में अपडेट करने के लिए। लेकिन समस्या यह है कि सोफेबेस पूरे रिकॉर्ड को ओवरराइट कर रहा है और शेष कॉलम के लिए न्यूल डाल रहा है।मैं मौजूदा डेटा को सोफेबेस में कैसे रखूं और केवल

एक दृष्टिकोण यह है कि इसे सभी डेटा को कैबेज से प्राप्त करने के बाद एक्सिसिटिंग रिकॉर्ड से कॉपी करना है, और फिर पुराने कॉल से डेटा कॉपी करते समय नए कॉलम को ओवरराइट करना है। लेकिन यह एक इष्टतम दृष्टिकोण की तरह नहीं दिखता

कोई सुझाव?

+0

कैसे Couchbase/CouchDB काम करता है यही कारण है कि। प्रत्येक दस्तावेज़ को पूरी तरह से लिखा जाना चाहिए। आप अलग-अलग हिस्सों को नहीं लिख सकते हैं। – WiredPrairie

उत्तर

0

यदि आप संरचित (जेसन) डेटा का उपयोग कर रहे हैं, तो आपको मौजूदा रिकॉर्ड को पढ़ने की आवश्यकता है, फिर अपने प्रोग्राम की डेटा संरचना में इच्छित फ़ील्ड को अपडेट करें और फिर रिकॉर्ड को फिर से भेजें। आप जेसन संरचना में अलग-अलग फ़ील्ड को फिर से भेजने के बिना अपडेट नहीं कर सकते हैं। इस के आसपास कोई रास्ता नहीं है कि मुझे पता है।

0

यह वास्तव में सच है, JSON दस्तावेज़ में अलग-अलग आइटम अपडेट करने के लिए, आपको पूरे दस्तावेज़ को लाने और उसे ओवरराइट करने की आवश्यकता है।

हम निकट भविष्य में अलग-अलग आइटम अपडेट जोड़ने पर काम कर रहे हैं।

+1

अभी तक एक नया अपडेट व्यक्तिगत आइटम सुविधा लागू किया गया है? – ChickenWing24

3

आप Couchbase N1QL अद्यतन के लिए Google को N1QL अद्यतन स्टेटमेंट्स का उपयोग कर सकते हैं अद्यतन अद्यतन दस्तावेज़ों के साथ पहले से मौजूद एक दस्तावेज़ को प्रतिस्थापित करता है।

अद्यतन:

UPDATE keyspace-ref [use-keys-clause] [set-clause] [unset-clause] [where-clause] [limit-clause] [returning-clause] 

सेट खंड:

SET path = expression [update-for] [ , path = expression [update-for] ]* 

अद्यतन-के लिए:

FOR variable (IN | WITHIN) path (, variable (IN | WITHIN) path)* [WHEN condition ] END 

सेट नहीं-खंड:

UNSET path [update-for] (, path [ update-for ])* 
keyspace-ref: Specifies the keyspace for which to update the document. 

आप इस तरह से keyspace-नाम के लिए एक वैकल्पिक नाम स्थान नाम जोड़ सकते हैं:

namespace-name:keyspace-name. 

उपयोग कुंजी-खंड: निर्दिष्ट करता है डेटा वस्तुओं के कुंजी अद्यतन करने की। वैकल्पिक। कुंजी कोई अभिव्यक्ति हो सकती है।

सेट-क्लॉज: एक विशेषता बदलने के लिए मान निर्दिष्ट करता है।

अनसेट-क्लॉज: दस्तावेज़ से निर्दिष्ट विशेषता को हटा देता है।

अद्यतन-के लिए: खंड के लिए अद्यतन सरणी में प्रत्येक मिलान तत्व के लिए दिए गए गुण को नेस्टेड सरणी और एसईटी या यूएनएसईटी पर फिर से करने के लिए फोर स्टेटमेंट का उपयोग करता है।

कहां-खंड: उस स्थिति को निर्दिष्ट करता है जिसे डेटा अपडेट करने के लिए पूरा करने की आवश्यकता होती है। वैकल्पिक।

सीमा-खंड: अद्यतन की जा सकने वाली वस्तुओं की सबसे बड़ी संख्या निर्दिष्ट करता है। इस खंड में इसके ऊपरी बाउंड के रूप में एक गैर-ऋणात्मक पूर्णांक होना चाहिए। वैकल्पिक।

लौटने-खंड: परिणाम_expression में निर्दिष्ट डेटा को वापस लौटाता है।

RBAC विशेषाधिकार

उपयोगकर्ता अद्यतन बयान को क्रियान्वित लक्ष्य keyspace पर क्वेरी अद्यतन विशेषाधिकार होना आवश्यक है। यदि कथन में कोई खंड है जिसके लिए डेटा पढ़ने की आवश्यकता है, जैसे कि SELECT क्लॉज, या रिटर्निंग क्लॉज, तो संबंधित क्लॉज में निर्दिष्ट कीपैस पर क्वेरी चयन विशेषाधिकार भी आवश्यक है। उपयोगकर्ता भूमिकाओं के बारे में अधिक जानकारी के लिए, प्राधिकरण देखें।

उदाहरण के लिए,

निम्नलिखित बयान पर अमल करने के लिए, उपयोगकर्ता travel-sample पर क्वेरी अद्यतन विशेषाधिकार होना आवश्यक है।

UPDATE `travel-sample` SET foo = 5 

निम्नलिखित बयान पर अमल करने के लिए, उपयोगकर्ता beer-sample पर विशेषाधिकार travel-sample और क्वेरी का चयन करें पर क्वेरी अद्यतन विशेषाधिकार होना आवश्यक है।

UPDATE `travel-sample` 
SET foo = 9 
WHERE city = (SELECT raw city FROM `beer-sample` WHERE type = "brewery" 
To execute the following statement, user must have the Query Update privilege on `travel-sample` and Query Select privilege on `travel-sample`. 

UPDATE `travel-sample` 
SET city = “San Francisco” 
WHERE lower(city) = "sanfrancisco" 
RETURNING * 
Example 

निम्न कथन में परिवर्तन उत्पाद के "प्रकार" "Odwalla-juice1" से "उत्पाद-रस"।

UPDATE product USE KEYS "odwalla-juice1" SET type = "product-juice" RETURNING product.type 

"results": [ 
     { 
      "type": "product-juice" 
     } 
    ] 

यह बयान "प्रकार" "उत्पाद" keyspace से दस्तावेज़ के लिए "Odwalla-juice1" कुंजी के साथ विशेषता निकाल देता है।

UPDATE product USE KEYS "odwalla-juice1" UNSET type RETURNING product.* 

"results": [ 
     { 
      "productId": "odwalla-juice1", 
      "unitPrice": 5.4 
     } 
    ] 

यह बयान महत्वपूर्ण है, "डेव" ट्यूटोरियल keyspace में साथ दस्तावेज़ के लिए "बच्चों" सरणी में "लिंग" विशेषता unsets।

UPDATE tutorial t USE KEYS "dave" UNSET c.gender FOR c IN children END RETURNING t 

"results": [ 
     { 
      "t": { 
       "age": 46, 
       "children": [ 
        { 
         "age": 17, 
         "fname": "Aiden" 
        }, 
        { 
         "age": 2, 
         "fname": "Bill" 
        } 
       ], 
       "email": "[email protected]", 
       "fname": "Dave", 
       "hobbies": [ 
        "golf", 
        "surfing" 
       ], 
       "lname": "Smith", 
       "relation": "friend", 
       "title": "Mr.", 
       "type": "contact" 
      } 
     } 
    ] 

संस्करण 4.5.1 प्रारंभ करना, अद्यतन विवरण एसईटी नेस्टेड सरणी तत्वों में सुधार किया गया है। फ़ोर क्लॉज को फ़ंक्शंस और एक्सप्रेशन का मूल्यांकन करने के लिए बढ़ाया गया है, और नया वाक्यविन्यास घोंसला वाले सरणी में फ़ील्ड तक पहुंचने और अपडेट करने के लिए अभिव्यक्तियों के लिए कई नेस्टेड का समर्थन करता है। फॉर क्लॉज को चेन करके अतिरिक्त सरणी स्तर समर्थित हैं।

उदाहरण

UPDATE default 
    SET i.subitems = (ARRAY OBJECT_ADD(s, 'new', 'new_value') 
     FOR s IN i.subitems END) 
      FOR s IN ARRAY_FLATTEN(ARRAY i.subitems 
       FOR i IN items END, 1) END; 
संबंधित मुद्दे