ফায়ারবেস ফায়ারস্টোর 'রেফারেন্স' ডেটা টাইপ কীসের জন্য ভাল?


187

আমি কেবল নতুন ফায়ারবেস ফায়ারস্টোর অন্বেষণ করছি এবং এটিতে একটি ডেটা টাইপ রয়েছে reference । এটি কী করে তা আমার কাছে পরিষ্কার নয়।

  • এটা কি বিদেশী চাবি মত?
  • এটি অন্য কোথাও অবস্থিত কোনও সংগ্রহের দিকে নির্দেশ করতে ব্যবহৃত হতে পারে?
  • যদি referenceপ্রকৃত রেফারেন্স হয় তবে আমি কি এটি প্রশ্নের জন্য ব্যবহার করতে পারি? উদাহরণস্বরূপ আমার কাছে কী একটি রেফারেন্স থাকতে পারে যা কোনও পাঠ্য ক্ষেত্রে ব্যবহারকারীকে সংরক্ষণ করার পরিবর্তে সরাসরি ব্যবহারকারীকে নির্দেশ করে? এবং আমি অনুসন্ধানের জন্য এই ব্যবহারকারীর রেফারেন্সটি ব্যবহার করতে পারি?

17
আমি মনে করি ফায়ারবেস টিমের এই ভিডিওটি আপনার জন্য এটি ভেঙে দিয়েছে: youtube.com/watch?v=Elg2zDVIcLo (4:36 থেকে দেখুন)
আদর্শ

উত্তর:


88

উল্লেখগুলি অনেকটা বিদেশী কীগুলির মতো like

বর্তমানে প্রকাশিত এসডিকে অন্যান্য প্রকল্পগুলির রেফারেন্স সংরক্ষণ করতে পারে না। একটি প্রকল্পের মধ্যে, রেফারেন্সগুলি অন্য কোনও সংগ্রহের অন্য কোনও দস্তাবেজের দিকে নির্দেশ করতে পারে।

আপনি অন্যান্য মানগুলির মতো ক্যোয়ারিতে রেফারেন্স ব্যবহার করতে পারেন: ফিল্টারিং, অর্ডার এবং পেজিংয়ের জন্য (startAt / startAfter)।

কোনও এসকিউএল ডাটাবেসে বিদেশী কীগুলির মতো নয়, রেফারেন্সগুলি একক ক্যোয়ারিতে যোগদানের জন্য কার্যকর নয়। আপনি এগুলি নির্ভরশীল অনুসন্ধানের জন্য ব্যবহার করতে পারেন (যা এর মতো যুক্ত হতে পারে) তবে সতর্ক থাকুন কারণ প্রতিটি হুপের ফলে সার্ভারে অন্য রাউন্ড ট্রিপ আসবে।


9
দয়া করে, আপনি কি ব্যবহারের সম্ভাব্য কেসগুলি ভাগ করতে পারেন? এই রেফারেন্সে ক্ষেত্রগুলি অনুসন্ধান করা কি সম্ভব? যেমন আমার কাছে friendsআমার সমস্ত বন্ধুদের তালিকাভুক্ত একটি সংগ্রহ রয়েছে ( friends/myId)। তারপরে, আমি friendsঅন্য দস্তাবেজের ক্ষেত্রে এই দস্তাবেজটি উল্লেখ করি ( group/groupId)। আমি শুধু আমার বন্ধুদের কে গ্রুপ আছে, ভালো কিছু করছেন প্রদর্শন করে চাই: where('friends.myId', '==', true)
উইল

107
বিটিডব্লু, এটি কোনও রেফারেন্স টাইপ যুক্ত করার উদাহরণ অন্তর্ভুক্ত করতে ডক্স আপডেট করতে কার্যকর হতে পারে ।
উইল

11
আমি এই সম্পর্কে কোন তথ্য খুঁজে পাচ্ছি না? এটি আমার পুরো ডাটাবেস কাঠামোকে বদলে দেবে, আমার আরও জানতে হবে ...
রুবেন

3
রেফারেন্স ব্যবহার করে কীভাবে জিজ্ঞাসা করবেন সে সম্পর্কে আপনার কাছে কী একটি উদাহরণ রয়েছে (পছন্দসই দ্রুতগতিতে)? এই মুহুর্তে, আমি স্ট্রিং হিসাবে কাঁচা uid সংরক্ষণ করে এটি করতে পারি, তবে এটি সঠিক বলে মনে হচ্ছে না।
মিকি চিয়াং

6
আমার সমস্ত রেফারেন্স ধরণের স্ট্রিংগুলিতে পরিবর্তন করা দরকার কারণ কোয়েরিটি সর্বদা একটি রেফারেন্স টাইপের সাথে ব্যর্থ হয়। আমি আক্ষরিকভাবে রেফারেন্স ধরণের মাধ্যমে কীভাবে জিজ্ঞাসা করব সে সম্পর্কে কিছুই খুঁজে পাচ্ছি না :( যদি কেউ রেফারেন্সের ধরণের মাধ্যমে কীভাবে জিজ্ঞাসা করতে হয় তা আমাকে জানতে দিন ...
স্যাম ট্রেন্ট

131

ফায়ারস্টোরের রেফারেন্স ব্যবহার করে আমার জন্য কী কাজ করেছে নীচে যুক্ত করা।

অন্য উত্তরগুলি যেমন বলে, এটি একটি বিদেশী কী এর মতো। রেফারেন্স বৈশিষ্ট্যটি যদিও রেফারেন্স ডকের ডেটা ফেরত দেয় না। উদাহরণস্বরূপ, আমার পণ্যগুলির একটি তালিকা রয়েছে, যার সাথে একটি ব্যবহারকারীর রেফ উল্লেখ রয়েছে পণ্যটির অন্যতম বৈশিষ্ট্য হিসাবে। পণ্যগুলির তালিকা পেতে, আমাকে সেই পণ্যটি তৈরির ব্যবহারকারীর রেফারেন্স দেয়। তবে এটি আমাকে সেই তথ্যসূত্রটিতে বিশদটি দেয় না। আমি অন্যান্য ব্যাক এন্ড পয়েন্টার সহ একটি পরিষেবা হিসাবে ব্যবহার করেছি তার আগে "পপুলেট: ট্রু" পতাকাটি যা ব্যবহারকারীর কেবলমাত্র রেফারেন্স আইডির পরিবর্তে ব্যবহারকারীকে বিশদ বিবরণ দেয়, যা এখানে রাখলে দুর্দান্ত হবে (আশা করি ভবিষ্যতের উন্নতি হবে) )।

নীচে কিছু উদাহরণ কোড দেওয়া হয়েছে যা আমি রেফারেন্স সেট করতে পাশাপাশি পণ্য তালিকা সংগ্রহ করতে ব্যবহার করে তারপরে দেওয়া ব্যবহারকারী রেফারেন্স আইডি থেকে ব্যবহারকারীর বিবরণ পেতে পারি।

একটি সংগ্রহে একটি রেফারেন্স সেট করুন:

let data = {
  name: 'productName',
  size: 'medium',
  userRef: db.doc('users/' + firebase.auth().currentUser.uid)
};
db.collection('products').add(data);

প্রতিটি দস্তাবেজের একটি সংগ্রহ (পণ্য) এবং সমস্ত উল্লেখ (ব্যবহারকারীর বিবরণ) পান:

db.collection('products').get()
    .then(res => {
      vm.mainListItems = [];
      res.forEach(doc => {
        let newItem = doc.data();
        newItem.id = doc.id;
        if (newItem.userRef) {
          newItem.userRef.get()
          .then(res => { 
            newItem.userData = res.data() 
            vm.mainListItems.push(newItem);
          })
          .catch(err => console.error(err));
        } else {
          vm.mainListItems.push(newItem);  
        }

      });
    })
    .catch(err => { console.error(err) });

আশাকরি এটা সাহায্য করবে


3
ভাগ করে নেওয়ার জন্য ধন্যবাদ! আমি মনে করি গেট অংশের প্রথম লাইনে একটি টাইপো রয়েছে এবং এটি হওয়া উচিত db.collection('products').get()। আপনি কি সরাসরি ব্যবহারকারী হওয়ার চেষ্টা করেছেন? আমি অনুমান করছি এর newItem.userRef.get()পরিবর্তে কাজ করা উচিতdb.collection("users").doc(newItem.userRef.id).get()
সের্গেই নেফেদেভ

51
সবার আগে উদাহরণের জন্য আপনাকে ধন্যবাদ। আমি আশা করি তারা ভবিষ্যতের জন্য একটি "জনবহুল: সত্য" যুক্ত করবে। অন্যথায় একটি রেফারেন্স সংরক্ষণ কিছুটা অর্থহীন। uidএটির মাধ্যমে কেবল রেফারেন্স এবং রেফারেন্স সংরক্ষণ করেও এটি করা যেতে পারে ।
জর্জেন ব্র্যান্ডসেটেটার

4
উদাহরণের জন্য ধন্যবাদ! কিন্তু যদি আমরা নথিকে জিজ্ঞাসা করি তখন কোন "পপুলেট" ধরণের বিকল্প না থাকলে রেফারেন্স প্রকারটি সংরক্ষণ করার কী দরকার? যদি এমন একটি জনবহুল বিকল্প থাকে যার সম্পর্কে যে কেউ জানেন তবে দয়া করে আমাকে জানান।
হর্ষিল শাহ

18
সুতরাং বাস্তবে এটি কোনও বিদেশী চাবির মতো নয়। আমার কাছে এটি মূলত কিছুই করে না - referenceএটি সত্যিকারের বিদেশী কী হিসাবে ব্যবহার না করতে পারলে কী দরকার?
জিন ডি'আরমে

14
সুতরাং referenceওভার এ এর একমাত্র সুবিধা stringহ'ল আপনি get()সরাসরি রেফারেন্সটিতে কল করতে পারেন । এখনও খুব দরকারী না। আশা করি তারা সংশ্লিষ্ট অবজেক্টের সাথে রেফারেন্স স্বয়ংক্রিয়ভাবে পপ করার জন্য একটি বিকল্প যুক্ত করবে!
মর্গলার

16

রেফারেন্সের দ্বারা জিজ্ঞাসাবাদ করার জন্য জাভাস্ক্রিপ্ট সমাধান অনুসন্ধান করার জন্য - ধারণাটি হ'ল, আপনার ক্যোয়ারী স্টেটমেন্টে একটি 'ডকুমেন্ট রেফারেন্স' অবজেক্ট ব্যবহার করা দরকার

teamDbRef = db.collection('teams').doc('CnbasS9cZQ2SfvGY2r3b'); /* CnbasS9cZQ2SfvGY2r3b being the collection ID */
//
//
db.collection("squad").where('team', '==', teamDbRef).get().then((querySnapshot) => {
  //
}).catch(function(error) {
  //
});

(উত্তরের কুদোস এখানে: https://stackoverflow.com/a/53141199/1487867 )

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