ফায়ারস্টোর ক্যোয়ারী সাবকলোকশন


125

আমি ভেবেছিলাম আমি পড়েছি যে আপনি নতুন ফায়ারবেস ফায়ার স্টোর দিয়ে উপকণাগুলির অনুসন্ধান করতে পারেন, তবে আমি এর কোনও উদাহরণ দেখছি না। উদাহরণস্বরূপ আমার নিম্নলিখিত ফায়ারস্টোর সেটআপ রয়েছে:

  • নৃত্য [সংগ্রহ]
    • danceName
    • গান [সংগ্রহ]
      • গানের নাম

আমি কীভাবে জিজ্ঞাসা করতে সক্ষম হবো "সমস্ত নৃত্য যেখানে গানেরনাম == 'এক্স'" অনুসন্ধান করুন "


1
এটি কি এখনও 2020 সালের আগুনের দোকানে সমর্থিত?
সজন্যমহ

উত্তর:


148

2019-05-07 আপডেট করুন

আজ আমরা সংগ্রহের গ্রুপ কোয়েরি প্রকাশ করেছি এবং এগুলি আপনাকে উপ- সংগ্রহগুলি জুড়ে জিজ্ঞাসা করার অনুমতি দেয়।

সুতরাং, ওয়েব এসডিকে উদাহরণস্বরূপ:

db.collectionGroup('Songs')
  .where('songName', '==', 'X')
  .get()

এটি যে কোনও সংগ্রহের নথির সাথে মিলবে যেখানে সংগ্রহের পথের শেষ অংশটি 'গানগুলি'।

আপনার আসল প্রশ্নটি নৃত্যগুলি সন্ধান করার বিষয়ে যেখানে গানেরনাম == 'এক্স' ছিল এবং এটি এখনও সরাসরি সম্ভব নয় তবে যাইহোক, প্রতিটি গানের সাথে মিলে যা আপনার পিতামাতাকে লোড করতে পারে।

আসল উত্তর

এটি এমন একটি বৈশিষ্ট্য যা এখনও বিদ্যমান নেই। এটিকে একটি "সংগ্রহ গোষ্ঠী কোয়েরি" বলা হয় এবং আপনাকে যে সমস্ত নাচের গান অন্তর্ভুক্ত করে তা বাদ দিয়ে সমস্ত গান জিজ্ঞাসা করতে দেয়। এটি এমন একটি বিষয় যা আমরা সমর্থন করার ইচ্ছা করি তবে এটি কখন আসবে সে সম্পর্কে কোনও দৃ concrete় সময়রেখা নেই have

এই মুহুর্তে বিকল্প কাঠামো হ'ল গানগুলি একটি শীর্ষ স্তরের সংগ্রহ করা এবং কোন নাচকে গানটি গানের একটি সম্পত্তির অংশ হিসাবে তৈরি করা।


147
ফায়ারস্টোর ডেভেল টিম সাব-কালেকশন কোয়েরিগুলি ASAP প্রয়োগ করে তবে এটি আরও ভাল। সর্বোপরি, 'আরও শক্তিশালী প্রশ্নগুলি' ফায়ার স্টোর ম্যানুয়াল অনুসারে অন্যতম প্রধান বিক্রয় পয়েন্ট। এখনই, ফায়ারস্টোর হ'ল চাকাবিহীন পোর্শের মতো।
আর্ন ওল্ফ্রাম্ম

21
আমরা রাজি! দিনটিতে কেবলমাত্র কয়েক ঘন্টা রয়েছে :-)।
গিল গিলবার্ট

20
আমি বুঝতে পারছি না, ফায়ারবেস সীমাবদ্ধ থাকলে লোকেরা কীসের জন্য অর্থ প্রদান করবে? এমনকি ব্যাকেন্ডলেস ফায়ারবেসের চেয়ে বেশি কার্যকারিতা রয়েছে বলে মনে হয়। এবং ফায়ারবেস এত জনপ্রিয় কেন? লোকেরা পাগল হয়ে গেছে দেখে মনে হচ্ছে
nzackoya

15
এই বৈশিষ্ট্যটি অত্যন্ত প্রয়োজন বা অন্যথায় লোকেরা বিকল্পগুলি সন্ধান করতে শুরু করবে, এমনকি আমাদের পূরণের সময়সীমাও রয়েছে। : পি
জেডি-ভি

13
আমাদের এই বৈশিষ্ট্যটি দরকার। ইজারা এ প্রকাশের সময়রেখা আমাদের প্রস্তুত হতে সাহায্য করবে।
সানজায়া প্যানিগ্রহে

22

এখনই আপডেট করুন ফায়ার স্টোর অ্যারে -যুক্তগুলিকে সমর্থন করে

এই নথিগুলি আছে

    {danceName: 'Danca name 1', songName: ['Title1','Title2']}
    {danceName: 'Danca name 2', songName: ['Title3']}

এভাবেই কর

collection("Dances")
    .where("songName", "array-contains", "Title1")
    .get()...

@ নেলসন.বি.আউস্টিন যেহেতু ফায়ার স্টোরটিতে এখনও এটি নেই, তাই আমি আপনাকে একটি সমতল কাঠামো রাখার পরামর্শ দিচ্ছি:

Dances = {
    danceName: 'Dance name 1',
    songName_Title1: true,
    songName_Title2: true,
    songName_Title3: false
}

এটি সেভাবে রাখা, আপনি এটি সম্পন্ন করতে পারেন:

var songTitle = 'Title1';
var dances = db.collection("Dances");
var query = dances.where("songName_"+songTitle, "==", true);

আশা করি এটা কাজে লাগবে.


2
কি জন্য songName_Title3: falseদরকারী? যদি আমি ভুল না হয় তবে এটি কেবলমাত্র এমন নৃত্যগুলির সন্ধান করতে ব্যবহৃত হতে পারে যা নির্দিষ্ট গানের নাম না ধরে ধরে আমাদের songName_Title3: falseএমন একটি dances.where("songName_"+songTitle, "==", false); ফলাফল ফেরত দেওয়ার দরকার হয় যা প্রতিটি নাচের পক্ষে প্রতিটি সম্ভাব্য গানের জন্য বুলিয়ান পতাকা রাখার মতো প্রভাব ফেলবে না নাম ...
এপ্লেগেল

এটি দুর্দান্ত তবে নথিগুলি 1MB এর মধ্যে সীমাবদ্ধ, সুতরাং আপনার যদি স্ট্রিংয়ের একটি দীর্ঘ তালিকা বা নির্দিষ্ট নথির সাথে যা কিছু সংযুক্ত করার প্রয়োজন হয় তবে আপনি এই পদ্ধতির ব্যবহার করতে পারবেন না।
সুপারটেকনোবফ

@ সুপেরেকনোবফ এটি মনে হচ্ছে এটির স্ট্রিংগুলির একটি খুব বড় এবং দীর্ঘ তালিকা হতে হবে। এই "অ্যারে_ কনটেনস" কোয়েরিটি কতটা পারফরম্যান্ট এবং আরও পারফরম্যান্ট বিকল্পগুলি কী?
জে অর্ডওয়ে

14

আপনি যদি সংগ্রহের পরিবর্তে কোনও বস্তু হিসাবে গান সঞ্চয় করেন? ক্ষেত্র হিসাবে গানের সাথে প্রতিটি নাচ: প্রবন্ধটি টাইপ করুন (সংগ্রহ নয়)

{
  danceName: "My Dance",
  songs: {
    "aNameOfASong": true,
    "aNameOfAnotherSong": true,
  }
}

তারপরে আপনি নেম অফফাসং এর সাথে সমস্ত নাচের জন্য জিজ্ঞাসা করতে পারেন:

db.collection('Dances')
  .where('songs.aNameOfASong', '==', true)
  .get()
  .then(function(querySnapshot) {
    querySnapshot.forEach(function(doc) {
      console.log(doc.id, " => ", doc.data());
    });
   })
   .catch(function(error) {
     console.log("Error getting documents: ", error);
    });

3
এই সমাধানটি কার্যকর হবে তবে গানের সংখ্যা বড় হলে বা গতিবেগের সাথে বাড়তে পারে সে ক্ষেত্রে এটি স্কেলযোগ্য নয়। এটি নথির আকার বাড়াতে এবং পড়ার / লেখার কার্যকারিতাটিকে প্রভাবিত করবে। এর সম্পর্কে আরও নীচে লিঙ্ক করা ফায়ারবেস ডকুমেন্টেশনগুলিতে পাওয়া যাবে (পৃষ্ঠায় শেষ সীমা 'সীমাবদ্ধতাগুলি দেখুন) ফায়ারবেস জিইএল
নওমান হানিফ

14

2019 আপডেট করুন

ফায়ার স্টোর কালেকশন গ্রুপ কোয়েরি প্রকাশ করেছে। গিলের উত্তর উপরে বা অফিসিয়াল কালেকশন গ্রুপ কোয়েরি ডকুমেন্টেশন দেখুন


পূর্ববর্তী উত্তর

গিল গিলবার্টের বক্তব্য অনুসারে, মনে হয় সংগ্রহের গোষ্ঠীগুলি অনুসন্ধান করে বর্তমানে চলছে। এই সময়ে মূল স্তরের সংগ্রহগুলি ব্যবহার করা এবং ডকুমেন্ট ইউআইডি'র ব্যবহার করে এই সংগ্রহগুলির মধ্যে কেবল লিঙ্ক করা ভাল।

যারা ইতিমধ্যে জানেন না তাদের জন্য, জেফ ডেলানির অ্যাংুলারফায়ারবেসে ফায়ারবেস (এবং কৌণিক) এর সাথে কাজ করা কারও জন্য কিছু অবিশ্বাস্য গাইড এবং সংস্থান রয়েছে

ফায়ারস্টোর নোএসকিউএল রিলেশনাল ডেটা মডেলিং - এখানে তিনি নোএসকিউএল এবং ফায়ারস্টোর ডিবি স্ট্রাকচারিংয়ের বেসিকগুলি ভেঙে ফেলেছেন

উদাহরণস্বরূপ ফায়ার স্টোর সহ উন্নত ডেটা মডেলিং - এটি আপনার মনের পিছনে রাখার জন্য আরও উন্নত কৌশল। যারা তাদের ফায়ারস্টোর দক্ষতাগুলি পরবর্তী স্তরে নিয়ে যেতে চান তাদের জন্য দুর্দান্ত পড়া


7

নতুন আপডেট 8 জুলাই, 2019:

db.collectionGroup('Songs')
  .where('songName', isEqualTo:'X')
  .get()

3

আপনি সর্বদা এটির মতো অনুসন্ধান করতে পারেন: -

this.key$ = new BehaviorSubject(null);

return this.key$.switchMap(key =>
  this.angFirestore
    .collection("dances").doc("danceName").collections("songs", ref =>
      ref
        .where("songName", "==", X)
    )
    .snapshotChanges()
    .map(actions => {
      if (actions.toString()) {
        return actions.map(a => {
          const data = a.payload.doc.data() as Dance;
          const id = a.payload.doc.id;
          return { id, ...data };
        });
      } else {
        return false;
      }
    })
);

3

অনুসন্ধান সীমাবদ্ধতা

ক্লাউড ফায়ারস্টোর নিম্নলিখিত ধরণের প্রশ্নের সমর্থন করে না:

  1. বিভিন্ন ক্ষেত্রে রেঞ্জ ফিল্টার সহ ক্যোয়ারী।

  2. একাধিক সংগ্রহ বা উপ-সংগ্রহগুলি জুড়ে একক প্রশ্ন। প্রতিটি ক্যোয়ারী নথিগুলির একক সংগ্রহের বিপরীতে চলে। আপনার ডেটা স্ট্রাকচার কীভাবে আপনার প্রশ্নগুলিকে প্রভাবিত করে সে সম্পর্কে আরও তথ্যের জন্য, একটি ডেটা স্ট্রাকচার চয়ন করুন দেখুন ।

  3. লজিকাল OR জিজ্ঞাসা। এই ক্ষেত্রে, আপনার প্রতিটি ওআর শর্তের জন্য পৃথক ক্যোয়ারী তৈরি করা উচিত এবং আপনার অ্যাপ্লিকেশনে ক্যোয়ারির ফলাফলগুলি মার্জ করা উচিত।

  4. একটি! = ধারা সহ প্রশ্নগুলি। এই ক্ষেত্রে, আপনার ক্যোয়ারীটি একটি বৃহত্তর-কোয়েরিতে এবং একটি কম-কোয়েরিতে বিভক্ত করা উচিত। উদাহরণস্বরূপ, যদিও কোয়েরির ধারাটি ("বয়স", "! =", "30") সমর্থিত নয়, আপনি দুটি প্রশ্নের সমন্বয় করে একই ফলস্বরূপ পেতে পারেন, একটি যেখানে "" বয়স "," < "," 30 ") এবং এমন একটি ধারা যেখানে (" বয়স ","> ", 30) রয়েছে।


2
var songs = []    
db.collection('Dances')
      .where('songs.aNameOfASong', '==', true)
      .get()
      .then(function(querySnapshot) {
        var songLength = querySnapshot.size
        var i=0;
        querySnapshot.forEach(function(doc) {
           songs.push(doc.data())
           i ++;
           if(songLength===i){
                console.log(songs
           }
          console.log(doc.id, " => ", doc.data());
        });
       })
       .catch(function(error) {
         console.log("Error getting documents: ", error);
        });

1

ফ্ল্যাট ডেটা স্ট্রাকচার ব্যবহার করা আরও ভাল হতে পারে।
দস্তাবেজগুলি এই পৃষ্ঠায় বিভিন্ন ডেটা স্ট্রাকচারের উপকারিতা এবং কনসগুলি নির্দিষ্ট করে ।

বিশেষত উপ-সংগ্রহগুলির সাথে কাঠামোর সীমাবদ্ধতা সম্পর্কে:

আপনি সহজেই উপ-সংগ্রহগুলি মুছতে পারবেন না বা উপ-সংগ্রহগুলি জুড়ে যৌগিক ক্যোয়ারীগুলি সম্পাদন করতে পারবেন না।

ফ্ল্যাট ডেটা স্ট্রাকচারের পছন্দসই সুবিধার সাথে বিপরীতে:

রুট-লেভেল সংগ্রহগুলি প্রতিটি সংকলনের মধ্যে শক্তিশালী অনুসন্ধানের পাশাপাশি সর্বাধিক নমনীয়তা এবং স্কেলাবিলিটি সরবরাহ করে।


1

আমি একটি সমাধান খুঁজে পেয়েছি। অনুগ্রহপূর্বক এটি যাচাই করুন.

var museums = Firestore.instance.collectionGroup('Songs').where('songName', isEqualTo: "X");
        museums.getDocuments().then((querySnapshot) {
            setState(() {
              songCounts= querySnapshot.documents.length.toString();
            });
        });

এবং তারপরে আপনি কনসোল.ফায়ারবায়স.কম থেকে আপনার ক্লাউড ফায়ার স্টোরে ডেটা, নিয়ম, সূচক, ব্যবহারের ট্যাব দেখতে পারেন। অবশেষে, আপনার সূচী ট্যাবে সূচি নির্ধারণ করা উচিত।এখানে চিত্র বর্ণনা লিখুন

সংগ্রহ আইডি এবং কিছু ক্ষেত্রের মান এখানে পূরণ করুন। তারপরে সংগ্রহ গ্রুপ বিকল্পটি নির্বাচন করুন। উপভোগ কর. ধন্যবাদ


এটি প্রশ্নের উত্তর দেয় না। উপরে উল্লিখিত ক্যোয়ারী সবেমাত্র গানের নাম = 'এক্স' সহ সমস্ত গান আনছে। এটি যেখানে গানের নাম = 'এক্স' নৃত্য সরবরাহ করবে না।
sachin ramad

0

আমি এখানে পর্যবেক্ষক এবং অ্যাঙ্গুলার ফায়ারের সাথে কাজ করছি মোড়কের তবে আমি কীভাবে এটি পরিচালনা করতে পেরেছিলাম তা এখানে।

এটি একধরণের পাগল, আমি এখনও পর্যবেক্ষণযোগ্যদের সম্পর্কে শিখছি এবং আমি সম্ভবত এটিকে ছাড়িয়েছি। তবে এটি একটি দুর্দান্ত অনুশীলন ছিল।

কিছু ব্যাখ্যা (কোনও আরএক্সজেএস বিশেষজ্ঞ নয়):

  • গানের আইডি an একটি পর্যবেক্ষণযোগ্য যা আইডিকে নির্গত করে
  • নাচ একটি পর্যবেক্ষণযোগ্য যা সেই আইডি পড়ে এবং তারপরে কেবল প্রথম মান পায়।
  • এরপরে এটির সমস্ত উদাহরণ খুঁজে পেতে সমস্ত গানের সংগ্রহ গোষ্ঠীটি জিজ্ঞাসা করে।
  • দৃষ্টান্তের ভিত্তিতে এটি পিতামাতৃ নৃত্যগুলিতে চলে যায় এবং তাদের আইডিগুলি পায়।
  • এখন যেহেতু আমাদের কাছে সমস্ত ডান্স আইড রয়েছে তাদের তাদের ডেটা পেতে আমাদের জিজ্ঞাসা করা দরকার। তবে আমি চেয়েছিলাম এটি ভালভাবে সম্পাদন করুক তাই একের পর এক জিজ্ঞাসা করার পরিবর্তে আমি তাদের 10 টি বালতিতে ব্যাচ করবো (সর্বাধিক কৌণিকটি গ্রহণ করবে)in প্রশ্নের ।
  • আমরা এন বালতি দিয়ে শেষ করি এবং তাদের মানগুলি পেতে ফায়ার স্টোরে এন ক্যোরিগুলি করা দরকার।
  • একবার আমরা ফায়ার স্টোরে অনুসন্ধানগুলি করে গেলে আমাদের এখনও এটি থেকে ডেটা পার্স করা দরকার।
  • এবং পরিশেষে আমরা এর মধ্যে সমস্ত নৃত্যের সাথে একক অ্যারে পেতে সমস্ত ক্যোয়ারির ফলাফলগুলিকে মার্জ করতে পারি।
type Song = {id: string, name: string};
type Dance = {id: string, name: string, songs: Song[]};

const songId$: Observable<Song> = new Observable();
const dance$ = songId$.pipe(
  take(1), // Only take 1 song name
  switchMap( v =>
    // Query across collectionGroup to get all instances.
    this.db.collectionGroup('songs', ref =>
      ref.where('id', '==', v.id)).get()
  ),
  switchMap( v => {
    // map the Song to the parent Dance, return the Dance ids
    const obs: string[] = [];
    v.docs.forEach(docRef => {
      // We invoke parent twice to go from doc->collection->doc
      obs.push(docRef.ref.parent.parent.id);
    });
    // Because we return an array here this one emit becomes N
    return obs;
  }),
  // Firebase IN support up to 10 values so we partition the data to query the Dances
  bufferCount(10),
  mergeMap( v => { // query every partition in parallel
    return this.db.collection('dances', ref => {
      return ref.where( firebase.firestore.FieldPath.documentId(), 'in', v);
    }).get();
  }),
  switchMap( v => {
    // Almost there now just need to extract the data from the QuerySnapshots
    const obs: Dance[] = [];
    v.docs.forEach(docRef => {
      obs.push({
        ...docRef.data(),
        id: docRef.id
      } as Dance);
    });
    return of(obs);
  }),
  // And finally we reduce the docs fetched into a single array.
  reduce((acc, value) => acc.concat(value), []),
);
const parentDances = await dance$.toPromise();

আমি আমার কোডটি পেস্ট করেছি এবং ভেরিয়েবলের নামগুলি আপনার কাছে পরিবর্তন করেছি, কোনও ত্রুটি আছে কিনা তা নিশ্চিত নয়, তবে এটি আমার পক্ষে ভাল কাজ করেছে। আপনি যদি কোনও ত্রুটি খুঁজে পান বা সম্ভবত কিছু মক ফায়ার স্টোর দিয়ে এটি পরীক্ষা করার আরও ভাল উপায়ের পরামর্শ দিতে পারেন তবে আমাকে জানান।

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