{মার্জ: সত্য} এবং আপডেটের সাথে সেট করার মধ্যে পার্থক্য


115

ইন মেঘ Firestore তিন লেখার অপারেশন আছে:

1) অ্যাড

2) সেট

3) আপডেট

দস্তাবেজগুলিতে এটি বলেছে যে ব্যবহারের set(object, {merge: true})ফলে বিদ্যমানটির সাথে বস্তুটি মার্জ হয়ে যাবে।

আপনি যখন ব্যবহার করেন তখন একই ঘটে থাকে update(object) তবে কোনও হলে পার্থক্য কী? এটি অদ্ভুত বলে মনে হচ্ছে যে গুগল যুক্তিগুলি নকল করবে।

উত্তর:


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
নোড.জেএস এর জন্য ক্লাউড . google.com/nodejs/docs/references/firestore/0.8.x/… দেখে মনে হচ্ছে ওয়েব এপিআই-তে সেই পদ্ধতি নেই। আপনি কোন প্লাটফর্মে আছেন তা নিশ্চিত ছিলেন না :)
Scarygami

10
আর একটি পার্থক্য যা আপনি উল্লেখ করতে পারেন তা হ'ল setডকুমেন্ট-আকারের ডেটাতে কাজ করে, যেখানে updateক্ষেত্রের পথ এবং মান জোড়া লাগে। এর অর্থ আপনি updateআরও জটিল হয়ে ওঠার সাথে গভীরভাবে নেস্ট করা মানগুলিতে পরিবর্তন করতে পারেন set। যেমন: set({a: {b: {c: true}}}, {merge: true})বনাম update('a.b.c', true)
গিল গিলবার্ট

যদি আমি কোনও দস্তাবেজের কোনও মান আপডেট করতে চাই, তবে তা বোঝা যায় যে আমি ইতিমধ্যে বিদ্যমান নথিগুলি আপডেট করতে চাই, সুতরাং আমার মনে হয় সেট + সংহতকরণ যে দরকারী নয় কারণ এটি তৈরি করবে এটি নথিটি নেই
জন বালভিন আরিয়াস

যদি আপনি সেট কমান্ডের যে ডেটা সরবরাহ করেন তার যদি ক্ষেত্রটি শূন্য থাকে তবে এটি ডাটাবেজে ইতিমধ্যে উপস্থিত থাকলে ক্ষেত্রটি বাতিল হয়ে যাবে বা এটি কি এটি একা রেখে দেবে?
ব্যবহারকারী 1023110

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
আপনি নিজে এটি পরীক্ষা করার চেষ্টা করেছেন? ডকুমেন্টেশনের একটি বিভাগ রয়েছে: "পুরো ডকুমেন্টটি ওভাররাইট না করে কোনও ডকুমেন্টের কিছু ক্ষেত্র আপডেট করতে আপডেট () পদ্ধতিটি ব্যবহার করুন ..." লিঙ্ক
ফিনলে পার্সি

2
আমি এটি বের করেছিলাম। আমি এটির আগে কেবল একটি অ্যারে দিয়ে চেষ্টা করেছি। আমি যেখানে অ্যারেতে একটি বস্তু যুক্ত করতে চেয়েছিলাম এবং সমস্ত কিছু অ্যারের জন্য ওভাররাইট হয়ে গেছে। এটি কোনও অ্যারেযুক্ত ক্ষেত্রগুলির সাথে কাজ করে না ... এটি ডক্সকে দাঁড়ায়।
ravo10

1
পরীক্ষার পরে ঠিক একই সিদ্ধান্তে পৌঁছেছি। আমি আশা করি তারা { merge: true }আপডেট বিকল্প হিসাবে একই বিকল্প রয়েছে এমন একটি বিকল্প যুক্ত করবে ।
জনরাইড

1
এই উত্তরের জন্য ধন্যবাদ! উদাহরণগুলি সহজ হলেও এটি গ্রহণযোগ্য উত্তরের চেয়ে আরও পরিষ্কার করে দিয়েছিল যা আমার ব্যবহারের জন্য ভাল।
নাইভাই

2
নেস্টেড ক্ষেত্রগুলিতে ওভাররাইটিং ডেটা এড়াতে (উপরের উত্তরের মতো) ব্যবহার করার সময় update, আপনি বিন্দু চিহ্নিতকরণ ব্যবহার করতে পারেন । updateআপনি যদি ডট সংকেত ব্যবহার / ব্যবহার না করেন তবে ওভাররাইটের আচরণটি ভিন্ন।
টেডস্কোস্কি

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
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.