{मर्ज: ट्रू} और अपडेट के साथ सेट में अंतर


115

में बादल Firestore तीन लिखने के संचालन देखते हैं:

1) जोड़ें

2) सेट

3) अद्यतन

डॉक्स में यह कहा गया है कि उपयोग set(object, {merge: true})करने से वस्तु मौजूदा के साथ विलय हो जाएगी।

ऐसा ही तब होता है जब आप उपयोग करते हैं update(object) तो क्या अंतर है अगर कोई है तो? यह अजीब लगता है कि Google तर्क को दोहराएगा।

जवाबों:


263

जिस तरह से मैंने अंतर को समझा:

  • setबिना mergeकिसी दस्तावेज़ के ऊपर लिख या अगर यह अभी तक अस्तित्व में नहीं है यह पैदा करेगा

  • setसाथ mergeदस्तावेज़ में फ़ील्ड अद्यतन करेगा या यदि वह मौजूद नहीं है इसे बनाने के

  • update फ़ील्ड अपडेट करेगा लेकिन यदि दस्तावेज़ मौजूद नहीं है तो विफल हो जाएगा

  • create यदि दस्तावेज़ पहले से मौजूद है तो दस्तावेज़ बनाएंगे लेकिन विफल रहेंगे

वहाँ भी डेटा आप के लिए प्रदान की वस्तु के रूप में एक फर्क है setऔर update

के लिए setआप हमेशा दस्तावेज़ के आकार का डेटा प्रदान करने के लिए है:

set(
  {a: {b: {c: true}}},
  {merge: true}
)

साथ updateआप भी नेस्टेड मानों को अद्यतन करने के लिए क्षेत्र के रास्तों का उपयोग कर सकते हैं:

update({
  'a.b.c': true
})

1
लेकिन आपने createएपीआई में कहां विधि पाई है?
ज़ूज़ेल

2
cloud.google.com/nodejs/docs/reference/firestore/0.8.x/… नोड के लिए। js. ऐसा लगता है कि वेब एपीआई में वह विधि नहीं है। यकीन नहीं था कि आप किस प्लेटफॉर्म पर हैं :)
स्केरगामी

10
एक और अंतर जिसका आप उल्लेख कर सकते हैं, वह setदस्तावेज़-आकार के डेटा पर संचालित होता है, जहां updateफ़ील्ड पथ और मूल्य जोड़े लेता है। इसका मतलब है कि आप इसके साथ गहराई से नेस्टेड मूल्यों में परिवर्तन कर सकते हैं updateजो इसके साथ अधिक बोझिल हैं set। उदाहरण के लिए: set({a: {b: {c: true}}}, {merge: true})बनाम update('a.b.c', true)
गिल गिलबर्ट

यदि मैं किसी दस्तावेज़ में एक मूल्य अद्यतन करना चाहता हूं, तो यह समझ में आता है कि मैं उन दस्तावेज़ों को अद्यतन करना चाहता हूं जो पहले से मौजूद हैं, इसलिए मुझे लगता है कि सेट + मर्ज़ाइलल वह उपयोगी नहीं है क्योंकि यह दस्तावेज़ को अस्तित्व में नहीं लाएगा
जॉन बल्विन एरियस

यदि आप सेट कमांड को जो डेटा प्रदान करते हैं, उसमें एक फ़ील्ड होता है जो शून्य है, तो क्या यह फ़ील्ड को रिक्त करने के लिए सेट करेगा यदि यह पहले से ही डेटाबेस में मौजूद है या क्या यह इसे अकेला छोड़ देगा?
user1023110

71

"मर्ज के साथ सेट" और "अपडेट" के बीच एक और अंतर (स्केरगामी के उत्तर का विस्तार), नेस्टेड मानों के साथ काम करते समय होता है।

यदि आपके पास इस तरह का एक दस्तावेज है:

 {
   "friends": {
     "friend-uid-1": true,
     "friend-uid-2": true,
   }
 }

और जोड़ना चाहते हैं {"friend-uid-3" : true}

इसका उपयोग करना:

db.collection('users').doc('random-id').set({ "friends": { "friend-uid-3": true } },{merge:true})

इस डेटा में परिणाम होगा:

 {
   "friends": {
     "friend-uid-1": true,
     "friend-uid-2": true,
     "friend-uid-3": true
   }
 }

हालाँकि इसका updateउपयोग करना:

db.collection('users').doc('random-id').update({ "friends": { "friend-uid-3": true } })

इस डेटा में परिणाम होगा:

 `{
   "friends": {
     "friend-uid-3": true
   }
 }`

1
क्या आपने स्वयं इसका परीक्षण करने की कोशिश की है? दस्तावेज़ में एक खंड है: "पूरे दस्तावेज़ को ओवरराइट किए बिना किसी दस्तावेज़ के कुछ क्षेत्रों को अपडेट करने के लिए, अद्यतन () विधि ..." लिंक का उपयोग करें
Finlay Percy

2
मैं यह समझ गया। मैंने केवल पहले एक सरणी के साथ यह कोशिश की थी। जहाँ मैं सरणी में एक ऑब्जेक्ट जोड़ना चाहता था, और उस सरणी के लिए सब कुछ अधिलेखित हो गया। यह सरणी वाले फ़ील्ड्स के साथ काम नहीं करता है ... यह इसे डॉक्स खड़ा करता है।
ravo10

1
परीक्षणों के बाद बस उसी निष्कर्ष पर पहुंचे। मुझे उम्मीद है कि वे एक विकल्प जोड़ देंगे { merge: true }जिसका अपडेट फ़ंक्शन के समान प्रभाव होगा ।
जॉनराइड

1
इस उत्तर के लिए धन्यवाद! उदाहरण, हालांकि सरल, ने स्वीकार किए गए उत्तर की तुलना में इसे अधिक साफ कर दिया, जो कि मेरे usecase के लिए बेहतर था।
निवई

2
उपयोग करते समय नेस्टेड फ़ील्ड्स में डेटा को ओवरराइट करने से बचने के लिए (जैसा कि ऊपर दिए गए उत्तर में है) update, आप डॉट नोटेशन का उपयोग कर सकते हैं । updateयदि आप डॉट नोटेशन का उपयोग करते हैं / नहीं करते हैं, तो ओवरराइट व्यवहार अलग है।
Tedskovsky

7

प्रति डॉक्स: https://firebase.google.com/docs/firestore/manage-data/add-data#update_fields_in_nested_objects

डॉट नोटेशन आपको अन्य नेस्टेड फ़ील्ड को अधिलेखित किए बिना एकल नेस्टेड फ़ील्ड को अपडेट करने की अनुमति देता है। यदि आप डॉट नोटेशन के बिना नेस्टेड फ़ील्ड को अपडेट करते हैं, तो आप पूरे मैप फ़ील्ड को ओवरराइट कर देंगे।

जैसा कि ऊपर कहा गया है, यह पूरे दोस्तों की संरचना को बदल देता है।

db.collection('users').doc('random-id').update({
    "friends": {
        "friend-uid-3": true
    }
})

यह नहीं करता।

db.collection('users').doc('random-id').update({
    "friends.friend-uid-3": true
})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.