ডেটা কানেক্ট প্রশ্নগুলি বাস্তবায়ন করুন

Firebase Data Connect আপনাকে Google Cloud SQL দ্বারা পরিচালিত আপনার PostgreSQL ইনস্ট্যান্সগুলির জন্য কানেক্টর তৈরি করতে দেয়। এই কানেক্টরগুলি হলো আপনার স্কিমা থেকে ডেটা ব্যবহার করার জন্য কোয়েরি এবং মিউটেশনের সমন্বয়।

গেট স্টার্টেড গাইডটিতে PostgreSQL-এর জন্য একটি মুভি রিভিউ অ্যাপ স্কিমা উপস্থাপন করা হয়েছে।

সেই নির্দেশিকাটিতে কোয়েরি সহ স্থাপনযোগ্য এবং অ্যাড-হক উভয় প্রকার প্রশাসনিক কার্যক্রমের সূচনা করা হয়েছিল।

  • ডিপ্লয়েবল কোয়েরি হলো সেগুলো, যা আপনি ক্লায়েন্ট অ্যাপ থেকে কল করার জন্য ইমপ্লিমেন্ট করেন এবং যার এপিআই এন্ডপয়েন্টগুলো আপনিই নির্ধারণ করেন। আপনি এগুলোকে একটি কানেক্টরের মধ্যে বান্ডল করে সার্ভারে ডিপ্লয় করেন। Data Connect টুলিং আপনার এপিআই-এর উপর ভিত্তি করে ক্লায়েন্ট এসডিকে তৈরি করে। ডিপ্লয় করা কোয়েরিগুলো আইএএম পলিসি দ্বারা সুরক্ষিত থাকে না, তাই Data Connect @auth ডিরেক্টিভ ব্যবহার করে এগুলোকে সুরক্ষিত করতে ভুলবেন না।
  • ডেটা পড়ার জন্য বিশেষ প্রশাসনিক কোয়েরিগুলো বিশেষাধিকারপ্রাপ্ত পরিবেশ থেকে চালানো হয়। আপনি Firebase কনসোলে অথবা আমাদের ডেটা কানেক্ট ভিএস কোড এক্সটেনশন ব্যবহার করে স্থানীয় ডেভেলপমেন্ট পরিবেশে এগুলো তৈরি ও কার্যকর করতে পারেন।

এই নির্দেশিকাটি ডিপ্লয়েবল কোয়েরিগুলো নিয়ে আরও গভীরভাবে আলোচনা করে।

Data Connect কোয়েরির বৈশিষ্ট্যসমূহ

Data Connect আপনাকে একটি PostgreSQL ডাটাবেসে প্রত্যাশিত সমস্ত উপায়েই সাধারণ কোয়েরি সম্পাদন করার সুযোগ দেয়।

কিন্তু Data Connect এর GraphQL এক্সটেনশনগুলির সাহায্যে, আপনি আরও দ্রুত ও কার্যকর অ্যাপের জন্য উন্নত কোয়েরি প্রয়োগ করতে পারেন:

  • রেকর্ডের উপর পুনরাবৃত্তিমূলক অপারেশন সহজ করার জন্য অনেক অপারেশন দ্বারা ফেরত আসা কী স্কেলার ব্যবহার করুন।
  • একাধিক ধাপের মিউটেশন অপারেশন চলাকালীন ডেটা খোঁজার জন্য কোয়েরি সম্পাদন করুন, যা কোডের লাইন এবং সার্ভারে রাউন্ড ট্রিপ বাঁচায়।

কোয়েরি তৈরি করতে জেনারেটেড ফিল্ড ব্যবহার করুন

আপনার Data Connect অপারেশনগুলো আপনার স্কিমার টাইপ এবং টাইপ সম্পর্কের উপর ভিত্তি করে Data Connect দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হওয়া এক সেট ফিল্ডকে প্রসারিত করবে। যখনই আপনি আপনার স্কিমা সম্পাদনা করেন, স্থানীয় টুলিং দ্বারা এই ফিল্ডগুলো তৈরি হয়।

আপনি জেনারেটেড ফিল্ড ব্যবহার করে ক্রমবর্ধমান জটিল কোয়েরি বাস্তবায়ন করতে পারেন, যেমন—একটি টেবিল থেকে একক রেকর্ড বা একাধিক রেকর্ড পুনরুদ্ধার করা, কিংবা সম্পর্কিত টেবিলগুলো থেকে একাধিক রেকর্ড সংগ্রহ করা।

ধরে নিন আপনার স্কিমাতে একটি Movie টাইপ এবং এর সাথে যুক্ত একটি Actor টাইপ রয়েছে। Data Connect তখন movie , movies , actors_on_movies ফিল্ড এবং আরও অনেক কিছু তৈরি করে।

এর সাথে জিজ্ঞাসা করুন
movie ক্ষেত্র

movie ফিল্ডটি Movie টেবিলের একটি একক রেকর্ডকে প্রতিনিধিত্ব করে।

এর কী (key) ব্যবহার করে কোনো একটি নির্দিষ্ট মুভি অনুসন্ধান করতে এই ফিল্ডটি ব্যবহার করুন।

query GetMovie($myKey: Movie_Key!) {
  movie(key: $myKey) { title }
}

এর সাথে জিজ্ঞাসা করুন
movies ক্ষেত্র

movies ফিল্ডটি ` Movie টেবিলের রেকর্ডগুলোর একটি তালিকা উপস্থাপন করে।

একাধিক সিনেমা অনুসন্ধান করতে এই ক্ষেত্রটি ব্যবহার করুন, উদাহরণস্বরূপ, একটি নির্দিষ্ট বছরের সমস্ত সিনেমা।

query GetMovies($myYear: Int!) {
  movies(where: { year: { eq: $myYear } }) { title }
}

এর সাথে জিজ্ঞাসা করুন
actors_on_movies

actors_on_movies ফিল্ডটি Actor এবং Movie টেবিল দুটিকে সংযুক্তকারী রেকর্ডের একটি তালিকা উপস্থাপন করে। কোনো নির্দিষ্ট সিনেমার সাথে যুক্ত সমস্ত অভিনেতাদের খুঁজে বের করতে এই ফিল্ডটি ব্যবহার করুন।

কোনো নির্দিষ্ট চলচ্চিত্রের সঙ্গে যুক্ত সমস্ত অভিনেতাদের সম্পর্কে জানতে এই ক্ষেত্রটি ব্যবহার করুন।

  query GetActorsOnMovie($myKey: Movie_Key!) {
    actors_on_movies(where: { movie: { key: { eq: $myKey } } }) {
      actor { name }
    }
  }

একটি কোয়েরির অপরিহার্য উপাদানসমূহ

Data Connect কোয়েরি হলো Data Connect এক্সটেনশনসহ গ্রাফকিউএল কোয়েরি। একটি সাধারণ গ্রাফকিউএল কোয়েরির মতোই, আপনি একটি অপারেশন নাম এবং গ্রাফকিউএল ভেরিয়েবলের একটি তালিকা নির্ধারণ করতে পারেন।

Data Connect @auth মতো কাস্টমাইজড ডিরেক্টিভ ব্যবহার করে GraphQL কোয়েরিগুলোকে আরও উন্নত করে।

সুতরাং নিম্নলিখিত কোয়েরিটিতে রয়েছে:

  • একটি query টাইপের সংজ্ঞা
  • ListMoviesByGenre অপারেশন (কোয়েরি) নাম
  • একটিমাত্র কোয়েরি আর্গুমেন্ট, এখানে $genre হলো String টাইপের একটি ভেরিয়েবল।
  • একটিমাত্র নির্দেশ, @auth
  • একটিই ক্ষেত্র, movies
query ListMoviesByGenre($genre: String!) @auth(level: PUBLIC) {
  movies(where: { genre: { eq: $genre } }) {
    id
    title
  }
}

প্রতিটি কোয়েরি আর্গুমেন্টের জন্য একটি টাইপ ডিক্লারেশন প্রয়োজন, যেমন String মতো একটি বিল্ট-ইন টাইপ, অথবা Movie মতো একটি কাস্টম, স্কিমা-সংজ্ঞায়িত টাইপ।

এই নির্দেশিকায় ক্রমশ জটিল হতে থাকা কোয়েরিগুলোর গঠনশৈলী নিয়ে আলোচনা করা হবে। এর শেষে আপনি শক্তিশালী ও সংক্ষিপ্ত কিছু রিলেশনশিপ এক্সপ্রেশনের সাথে পরিচয় করিয়ে দেবেন, যা ব্যবহার করে আপনি আপনার ডেপ্লয়যোগ্য কোয়েরি তৈরি করতে পারবেন।

কোয়েরিতে মূল স্কেলার

তবে প্রথমে, মূল স্কেলারগুলো সম্পর্কে একটি কথা।

Data Connect প্রতিটি টেবিলের প্রাইমারি কী উপস্থাপন করার জন্য একটি বিশেষ কী স্কেলার সংজ্ঞায়িত করে, যা {TableType}_Key দ্বারা চিহ্নিত করা হয়। এটি প্রাইমারি কী-এর মানগুলোর একটি JSON অবজেক্ট।

বেশিরভাগ স্বয়ংক্রিয়ভাবে তৈরি রিড ফিল্ড থেকে প্রাপ্ত প্রতিক্রিয়া হিসাবে, অথবা অবশ্যই সেইসব কোয়েরি থেকে আপনি কী স্কেলারগুলি পুনরুদ্ধার করেন, যেখানে আপনি স্কেলার কী তৈরি করার জন্য প্রয়োজনীয় সমস্ত ফিল্ড সংগ্রহ করেছেন।

একক স্বয়ংক্রিয় কোয়েরি, যেমন আমাদের চলমান উদাহরণে movie , একটি 'key' আর্গুমেন্ট সমর্থন করে যা একটি 'key' স্কেলার গ্রহণ করে।

আপনি একটি কী স্কেলারকে লিটারেল হিসেবে পাস করতে পারেন। কিন্তু, কী স্কেলারকে ইনপুট হিসেবে পাস করার জন্য আপনি ভেরিয়েবল সংজ্ঞায়িত করতে পারেন।

প্রশ্ন

query GetMovie($myKey: Movie_Key!) {
  movie(key: $myKey) { title }
}
    

প্রতিক্রিয়া

{
  "data": {
    "movie": {
      "title": "Example Movie Title"
    }
  }
}
    

এগুলো রিকোয়েস্ট JSON-এ এইভাবে (বা অন্যান্য সিরিয়ালাইজেশন ফরম্যাটে) প্রদান করা যেতে পারে:

{
  # 
  "variables": {
    "myKey": {"id": "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"}
  }
}

কাস্টম স্কেলার পার্সিংয়ের কল্যাণে, অবজেক্ট সিনট্যাক্স ব্যবহার করেও একটি Movie_Key তৈরি করা যায়, যাতে ভ্যারিয়েবল থাকতে পারে। এটি মূলত তখন কাজে লাগে যখন আপনি কোনো কারণে স্বতন্ত্র উপাদানগুলোকে আলাদা আলাদা ভ্যারিয়েবলে ভাগ করতে চান।

মৌলিক প্রশ্ন লিখুন

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

ব্যক্তিগত রেকর্ড পুনরুদ্ধার করুন

সবচেয়ে সহজ কোয়েরিটি আইডি দিয়ে একটিমাত্র রেকর্ড খুঁজে বের করে। আপনার কোয়েরিটি স্বয়ংক্রিয়ভাবে তৈরি হওয়া movie ফিল্ডটি ব্যবহার করবে।

প্রশ্ন

query GetMovieById($id: UUID!) @auth(level: PUBLIC) {
  movie(id: $id) {
    id
    title
    imageUrl
    genre
  }
}
    

প্রতিক্রিয়া

{
  "data": {
    "movie": {
      "id": "some-uuid",
      "title": "Example Movie Title",
      "imageUrl": "https://example.com/movie.jpg",
      "genre": "Action"
    }
  }
}
    

একটি টেবিলের সমস্ত রেকর্ড পুনরুদ্ধার করুন

Movies টেবিল থেকে সিনেমার সম্পূর্ণ তালিকার কিছু ফিল্ড পুনরুদ্ধার করতে, আপনার কোয়েরিটি স্বয়ংক্রিয়ভাবে তৈরি হওয়া movies ফিল্ডটি ব্যবহার করবে এবং এর বাস্তবায়নটি নিচের মতো হতে পারে।

প্রশ্ন

query ListMovies @auth(level: PUBLIC) {
  movies {
    id
    title
    imageUrl
    genre
  }
}
    

প্রতিক্রিয়া

{
  "data": {
    "movies": [
      {
        "id": "some-uuid",
        "title": "Example Movie Title",
        "imageUrl": "https://example.com/movie.jpg",
        "genre": "Action"
      },
      {
        "id": "another-uuid",
        "title": "Another Movie Title",
        "imageUrl": "https://example.com/another-movie.jpg",
        "genre": "Comedy"
      }
    ]
  }
}
    

orderBy , limit এবং offset অপারেটর ব্যবহার করুন

স্বাভাবিকভাবেই, একটি টেবিলের সমস্ত রেকর্ড তালিকাভুক্ত করার উপযোগিতা সীমিত।

আপনি ফলাফল সাজাতে এবং পৃষ্ঠাঙ্কন করতে পারেন। এই আর্গুমেন্টগুলো গৃহীত হয়, কিন্তু ফলাফলে ফেরত দেওয়া হয় না।

এখানে, কোয়েরিটি রেটিং অনুযায়ী সেরা ১০টি সিনেমার শিরোনাম খুঁজে বের করে।

প্রশ্ন

query MoviesTop10 {
  movies(orderBy: [{ rating: DESC }], limit: 10) {
    # graphql: list the fields from the results to return
    title
  }
}
    

প্রতিক্রিয়া

{
  "data": {
    "movies": [
      { "title": "Top Movie 1" },
      { "title": "Top Movie 2" },
      { "title": "Top Movie 3" }
      // ... other 7 movies
    ]
  }
}
    

আপনার হয়তো কোনো অফসেট থেকে সারিগুলো আনার প্রয়োজন হতে পারে, যেমন রেটিং অনুসারে সাজানো ১১ থেকে ২০ নম্বর সিনেমাগুলো।

প্রশ্ন

query Movies11to20 {
  movies(orderBy: [{ rating: DESC }], limit: 10, offset: 10) {
    # graphql: list the fields from the results to return
    title
  }
}
    

প্রতিক্রিয়া

{
  "data": {
    "movies": [
      { "title": "Movie 11" },
      { "title": "Movie 12" },
      { "title": "Movie 13" }
      // ... other 7 movies
    ]
  }
}
    

কোয়েরিতে উপনাম ব্যবহার করুন

Data Connect কোয়েরিতে গ্রাফকিউএল অ্যালিয়াসিং সমর্থন করে। অ্যালিয়াসের মাধ্যমে, আপনি কোয়েরির ফলাফলে ফেরত আসা ডেটার নাম পরিবর্তন করতে পারেন। একটি একক Data Connect কোয়েরি সার্ভারে একটি কার্যকর অনুরোধের মাধ্যমে একাধিক ফিল্টার বা অন্যান্য কোয়েরি অপারেশন প্রয়োগ করতে পারে, যা কার্যকরভাবে একবারে বেশ কয়েকটি "সাব-কোয়েরি" জারি করে। ফেরত আসা ডেটাসেটে নামের সংঘর্ষ এড়াতে, সাব-কোয়েরিগুলোকে আলাদা করার জন্য অ্যালিয়াস ব্যবহার করা হয়।

এখানে এমন একটি কোয়েরি রয়েছে যেখানে একটি এক্সপ্রেশনে mostPopular এবং leastPopular এই অ্যালিয়াসগুলো ব্যবহৃত হয়েছে।

প্রশ্ন

query ReviewPopularitySpread($genre: String) {
  mostPopular: review(
    first: {
      where: {genre: {eq: $genre}},
      orderBy: {popularity: DESC}
    }
  ),
  leastPopular: review(
    last: {
      where: {genre: {eq: $genre}},
      orderBy: {popularity: DESC}
    }
  )
}
    

প্রতিক্রিয়া

{
  "data": {
    "mostPopular": [
      { "popularity": 9 }
    ],
    "leastPopular": [
      { "popularity": 1 }
    ]
  }
}
    

কোয়েরি ফিল্টার ব্যবহার করুন

Data Connect কোয়েরিগুলো সকল প্রচলিত SQL ফিল্টার এবং অর্ডার অপারেশনের সাথে সংযুক্ত।

` where এবং orderBy অপারেটর ব্যবহার করে ফিল্টার করুন

টেবিল থেকে মিলে যাওয়া সমস্ত সারি (এবং এর সাথে থাকা সারিগুলোও) ফেরত দেয়। ফিল্টারের সাথে কোনো রেকর্ড না মিললে একটি খালি অ্যারে ফেরত দেয়।

প্রশ্ন

query MovieByTopRating($genre: String) {
  mostPopular: movies(
    where: { genre: { eq: $genre } },
    orderBy: { rating: DESC }
  ) {
    # graphql: list the fields from the results to return
    id
    title
    genre
    description
  }
}
    

প্রতিক্রিয়া

{
  "data": {
    "mostPopular": [
      {
        "id": "some-uuid",
        "title": "Example Movie Title",
        "genre": "Action",
        "description": "A great movie"
      }
    ]
  }
}
    

নাল মান পরীক্ষা করে ফিল্টার করুন

আপনি isNull অপারেটর ব্যবহার করে null ভ্যালু পরীক্ষা করতে পারেন।

প্রশ্ন

query ListMoviesWithoutDescription {
  movies(where: { description: { isNull: true }}) {
    id
    title
  }
}
    

প্রতিক্রিয়া

{
  "data": {
    "movies": [
      {
        "id": "some-uuid",
        "title": "Example Movie Title"
      },
      {
        "id": "another-uuid",
        "title": "Another Movie Title"
      }
    ]
  }
}
    

আরও অপারেটরের জন্য, ইনপুট অবজেক্টের প্রকারভেদ সংক্রান্ত নির্দেশিকা দেখুন।

মান তুলনার মাধ্যমে ফিল্টার করুন

আপনার কোয়েরিতে মান তুলনা করার জন্য আপনি lt (লেস দ্যান) এবং ge (গ্রেটার দ্যান অর ইকুয়াল)-এর মতো অপারেটর ব্যবহার করতে পারেন।

প্রশ্ন

query ListMoviesByRating($minRating: Int!, $maxRating: Int!) {
  movies(where: { rating: { ge: $minRating, lt: $maxRating }}) {
    id
    title
  }
}
    

প্রতিক্রিয়া

{
  "data": {
    "movies": [
      {
        "id": "some-uuid",
        "title": "Example Movie Title"
      },
      {
        "id": "another-uuid",
        "title": "Another Movie Title"
      }
    ]
  }
}
    

অ্যারে ফিল্ডগুলির জন্য includes এবং excludes অপারেটর ব্যবহার করে ফিল্টার করুন

আপনি পরীক্ষা করে দেখতে পারেন যে একটি অ্যারে ফিল্ডে একটি নির্দিষ্ট আইটেম অন্তর্ভুক্ত আছে কিনা।

নিম্নলিখিত উদাহরণটি includes অপারেটরটি ব্যাখ্যা করে।

Data Connect includesAll , excludes , excludesAll এবং আরও অনেক কিছু সমর্থন করে। রেফারেন্স ডকুমেন্টেশনের _ListFilter হেডিংগুলোতে ইন্টিজার, স্ট্রিং, তারিখ এবং অন্যান্য ডেটা টাইপের জন্য এই ধরনের সমস্ত অপারেটর পর্যালোচনা করুন।

প্রশ্ন

query ListMoviesByTag($tag: String!) {
  movies(where: { tags: { includes: $tag }}) {
    # graphql: list the fields from the results to return
    id
    title
  }
}
    

প্রতিক্রিয়া

{
  "data": {
    "movies": [
      {
        "id": "some-uuid",
        "title": "Example Movie Title"
      }
    ]
  }
}
    

স্ট্রিং অপারেশন এবং রেগুলার এক্সপ্রেশন দিয়ে ফিল্টার করুন

আপনার কোয়েরিগুলোতে রেগুলার এক্সপ্রেশনসহ সাধারণ স্ট্রিং সার্চ এবং তুলনা করার অপারেশন ব্যবহার করা যেতে পারে। লক্ষ্য করুন, কার্যকারিতার জন্য আপনি এখানে একাধিক অপারেশনকে একত্রিত করছেন এবং অ্যালিয়াসের মাধ্যমে সেগুলোর মধ্যে পার্থক্য স্পষ্ট করছেন।

query MoviesTitleSearch($prefix: String, $suffix: String, $contained: String, $regex: String) {
  prefixed: movies(where: {title: {startsWith: $prefix}}) {...}
  suffixed: movies(where: {title: {endsWith: $suffix}}) {...}
  contained: movies(where: {title: {contains: $contained}}) {...}
}

_or , _and , _not অপারেটর লজিক ব্যবহার করে ফিল্টার করুন

আরও জটিল লজিকের জন্য _or ব্যবহার করুন। Data Connect _and এবং _not অপারেটরগুলোও সমর্থন করে।

প্রশ্ন

query ListMoviesByGenreAndGenre($minRating: Int!, $genre: String) {
  movies(
    where: { _or: [{ rating: { ge: $minRating } }, { genre: { eq: $genre } }] }
  ) {
    # graphql: list the fields from the results to return
    title
  }
}
    

প্রতিক্রিয়া

{
  "data": {
    "movies": [
      { "title": "Movie Title 1" },
      { "title": "Movie Title 2" }
    ]
  }
}
    

রিলেশনাল কোয়েরি লিখুন

Data Connect কোয়েরিগুলো টেবিলগুলোর মধ্যকার সম্পর্কের উপর ভিত্তি করে ডেটা অ্যাক্সেস করতে পারে। আপনি আপনার স্কিমাতে সংজ্ঞায়িত অবজেক্ট (এক-থেকে-এক) বা অ্যারে (এক-থেকে-অনেক) সম্পর্ক ব্যবহার করে নেস্টেড কোয়েরি তৈরি করতে পারেন; অর্থাৎ, এক ধরনের ডেটার সাথে তার নেস্টেড বা সম্পর্কিত ধরনের ডেটাও ফেচ করতে পারেন।

এই ধরনের কোয়েরিগুলো জেনারেটেড রিড ফিল্ডে ম্যাজিক Data Connect _on_ এবং _via সিনট্যাক্স ব্যবহার করে।

নমুনা স্কিমাটি পর্যালোচনা করতে মনে রাখবেন।

অনেক থেকে এক

এখন _on_ সিনট্যাক্স বোঝানোর জন্য একটি কোয়েরি দেখুন।

প্রশ্ন

query MyReviews @auth(level: USER) {
  user(key: {id_expr: "auth.uid"}) {
    reviews: reviews_on_user {
      movie { name }
      rating
    }
  }
}
    

প্রতিক্রিয়া

{
  "data": {
    "user": {
      "reviews": [
        {
          "movie": { "name": "Movie Title" },
          "rating": 5
        }
      ]
    }
  }
}
    

একের সাথে এক

আপনি _on_ সিনট্যাক্স ব্যবহার করে একটি ওয়ান-টু-ওয়ান কোয়েরি লিখতে পারেন।

প্রশ্ন

query GetMovieMetadata($id: UUID!) @auth(level: PUBLIC) {
  movie(id: $id) {
    movieMetadatas_on_movie {
      director
    }
  }
}
    

প্রতিক্রিয়া

{
  "data": {
    "movie": {
      "movieMetadatas_on_movie": {
        "director": "Some Director"
      }
    }
  }
}
    

অনেক থেকে অনেক

মেনি-টু-মেনি কোয়েরিতে _via_ সিনট্যাক্স ব্যবহৃত হয়। একটি মেনি-টু-মেনি কোয়েরি কোনো নির্দিষ্ট সিনেমার অভিনেতাদের খুঁজে বের করতে পারে।

প্রশ্ন

query MoviesActors($id: UUID!) @auth(level: USER) {
  movie(id: $id) {
     actors: actors_via_MovieActors {
        name
     }
  }
}
    

প্রতিক্রিয়া

{
  "data": {
    "movie": {
      "actors": [
        {
          "name": "Actor Name"
        }
      ]
    }
  }
}
    

কিন্তু আমরা অ্যালিয়াস ব্যবহার করে আরও জটিল একটি কোয়েরি লিখতে পারি, যা role উপর ভিত্তি করে ফিল্টার করে mainActors এবং supportingActors রেজাল্ট থেকে অভিনেতা ও সংশ্লিষ্ট সিনেমাগুলো খুঁজে বের করবে। যেহেতু এটি মেনি-টু-মেনি, তাই _via_ সিনট্যাক্স ব্যবহার করা হয়।

প্রশ্ন

query GetMovieCast($movieId: UUID!, $actorId: UUID!) @auth(level: PUBLIC) {
  movie(id: $movieId) {
    mainActors: actors_via_MovieActor(where: { role: { eq: "main" } }) {
      name
    }
    supportingActors: actors_via_MovieActor(
      where: { role: { eq: "supporting" } }
    ) {
      name
    }
  }
  actor(id: $actorId) {
    mainRoles: movies_via_MovieActor(where: { role: { eq: "main" } }) {
      title
    }
    supportingRoles: movies_via_MovieActor(
      where: { role: { eq: "supporting" } }
    ) {
      title
    }
  }
}
    

প্রতিক্রিয়া

{
  "data": {
    "movie": {
      "mainActors": [
        {
          "name": "Main Actor Name"
        }
      ],
      "supportingActors": [
        {
          "name": "Supporting Actor Name"
        }
      ]
    },
    "actor": {
      "mainRoles": [
        {
          "title": "Main Role Movie Title"
        }
      ],
      "supportingRoles": [
        {
          "title": "Supporting Role Movie Title"
        }
      ]
    }
  }
}
    

সমষ্টিগত কোয়েরি

অ্যাগ্রিগেট বলতে কী বোঝায় এবং কেন এগুলো ব্যবহার করা হয়?

অ্যাগ্রিগেট ফিল্ড আপনাকে ফলাফলের তালিকার উপর গণনা সম্পাদন করতে দেয়। অ্যাগ্রিগেট ফিল্ড ব্যবহার করে আপনি নিম্নলিখিত কাজগুলো করতে পারেন:

  • একটি পর্যালোচনার গড় স্কোর খুঁজুন
  • শপিং কার্টে থাকা আইটেমগুলোর মোট মূল্য খুঁজুন।
  • সর্বোচ্চ বা সর্বনিম্ন রেটিংযুক্ত পণ্যটি খুঁজুন
  • আপনার দোকানে পণ্যের সংখ্যা গণনা করুন

অ্যাগ্রিগেট গণনা সার্ভারে করা হয়, যা ক্লায়েন্ট সাইডে গণনা করার তুলনায় বেশ কিছু সুবিধা প্রদান করে:

  • অ্যাপের পারফরম্যান্স দ্রুততর হয় (যেহেতু আপনি ক্লায়েন্ট সাইডের গণনা এড়িয়ে চলেন)।
  • ডেটা প্রেরণের খরচ হ্রাস পায় (যেহেতু আপনি সমস্ত ইনপুটের পরিবর্তে শুধুমাত্র সমষ্টিগত ফলাফল পাঠান)
  • উন্নত নিরাপত্তা (যেহেতু আপনি ক্লায়েন্টদের সম্পূর্ণ ডেটা সেটের পরিবর্তে সমষ্টিগত ডেটাতে অ্যাক্সেস দিতে পারেন)

অ্যাগ্রিগেটের জন্য উদাহরণ স্কিমা

এই অংশে, আমরা একটি স্টোরফ্রন্ট উদাহরণ স্কিমাতে যাব, যা অ্যাগ্রিগেট কীভাবে ব্যবহার করতে হয় তা ব্যাখ্যা করার জন্য ভালো:

  type Product @table {
    name: String!
    manufacturer: String!
    quantityInStock: Int!
    price: Float!
    expirationDate: Date
  }

সরল সমষ্টি

সমস্ত ক্ষেত্রের জন্য গণনা

সবচেয়ে সহজ অ্যাগ্রিগেট ফিল্ড হলো _count : এটি আপনার কোয়েরির সাথে কতগুলো সারি মিলেছে তা ফেরত দেয়। আপনার টাইপের প্রতিটি ফিল্ডের জন্য, Data Connect ফিল্ডের ধরন অনুযায়ী সংশ্লিষ্ট অ্যাগ্রিগেট ফিল্ড তৈরি করে।

প্রশ্ন

query CountProducts {
  products {
    _count
  }
}

প্রতিক্রিয়া
one

উদাহরণস্বরূপ, যদি আপনার ডাটাবেসে ৫টি পণ্য থাকে, তাহলে ফলাফলটি হবে:

{
  "products": [
    {
    "_count": 5
    }
  ]
}

প্রতিটি ফিল্ডে একটি <field>_count ফিল্ড থাকে, যা গণনা করে যে কতগুলো সারিতে সেই ফিল্ডটিতে একটি নন-নাল (non-null) মান রয়েছে।

প্রশ্ন

query CountProductsWithExpirationDate {
  products {
    expirationDate_count
  }
}

প্রতিক্রিয়া
field_count

উদাহরণস্বরূপ, যদি আপনার কাছে মেয়াদোত্তীর্ণ তারিখসহ ৩টি পণ্য থাকে, তাহলে ফলাফলটি হবে:

{
  "products": [
    {
    "expirationDate_count": 3
    }
  ]
}
সংখ্যাসূচক ফিল্ডের জন্য _min, _max, _sum এবং _avg

সংখ্যাসূচক ফিল্ডগুলোর (int, float, int64) ক্ষেত্রেও <field>_min , <field>_max , <field>_sum , এবং <field>_avg রয়েছে।

প্রশ্ন

query NumericAggregates {
  products {
  quantityInStock_max
  price_min
  price_avg
  quantityInStock_sum
  }
}

প্রতিক্রিয়া
_min _max _sum _avg

উদাহরণস্বরূপ, যদি আপনার নিম্নলিখিত পণ্যগুলি থাকে:

  • পণ্য ক: quantityInStock: 10 , price: 2.99
  • পণ্য বি: quantityInStock: 5 , price: 5.99
  • পণ্য সি: quantityInStock: 20 , price: 1.99

ফলাফলটি হবে:

{
  "products": [
    {
    "quantityInStock_max": 20,
    "price_min": 1.99,
    "price_avg": 3.6566666666666666,
    "quantityInStock_sum": 35
    }
  ]
}
তারিখ এবং টাইমস্ট্যাম্পের জন্য _min এবং _max

তারিখ এবং টাইমস্ট্যাম্প ফিল্ডে <field>_min এবং <field>_max রয়েছে।

প্রশ্ন

query DateAndTimeAggregates {
  products {
  expirationDate_max
  expirationDate_min
  }
}

প্রতিক্রিয়া
_min _maxdatetime

উদাহরণস্বরূপ, যদি আপনার নিম্নলিখিত মেয়াদ শেষ হওয়ার তারিখগুলি থাকে:

  • পণ্য এ: 2024-01-01
  • পণ্য বি: 2024-03-01
  • পণ্য সি: 2024-02-01

ফলাফলটি হবে:

{
  "products": [
    {
    "expirationDate_max": "2024-03-01",
    "expirationDate_min": "2024-01-01"
    }
  ]
}

স্বতন্ত্র

distinct আর্গুমেন্টটি আপনাকে একটি ফিল্ডের (বা একাধিক ফিল্ডের সমন্বয়ের) সমস্ত অনন্য মান পেতে সাহায্য করে। উদাহরণস্বরূপ:

প্রশ্ন

query ListDistinctManufacturers {
  products(distinct: true) {
    manufacturer
  }
}

প্রতিক্রিয়া
distinct

উদাহরণস্বরূপ, যদি আপনার নিম্নলিখিত নির্মাতারা থাকে:

  • পণ্য A: manufacturer: "Acme"
  • পণ্য বি: manufacturer: "Beta"
  • পণ্য সি: manufacturer: "Acme"

ফলাফলটি হবে:

{
  "products": [
    { "manufacturer": "Acme" },
    { "manufacturer": "Beta" }
  ]
}

আপনি স্বতন্ত্র মানগুলিকে একত্রিত করার জন্য অ্যাগ্রিগেট ফিল্ডগুলিতে distinct আর্গুমেন্টটিও ব্যবহার করতে পারেন। উদাহরণস্বরূপ:

প্রশ্ন

query CountDistinctManufacturers {
  products {
    manufacturer_count(distinct: true)
  }
}

প্রতিক্রিয়া
distinctonaggregate

উদাহরণস্বরূপ, যদি আপনার নিম্নলিখিত নির্মাতারা থাকে:

  • পণ্য A: manufacturer: "Acme"
  • পণ্য বি: manufacturer: "Beta"
  • পণ্য সি: manufacturer: "Acme"

ফলাফলটি হবে:

{
  "products": [
    {
    "manufacturer_count": 2
    }
  ]
}

দলবদ্ধ সমষ্টি

একটি টাইপে অ্যাগ্রিগেট এবং নন-অ্যাগ্রিগেট ফিল্ডের মিশ্রণ নির্বাচন করার মাধ্যমে আপনি একটি গ্রুপড অ্যাগ্রিগেট সম্পাদন করেন। এটি নন-অ্যাগ্রিগেট ফিল্ডগুলোর জন্য একই মান থাকা সমস্ত মিলে যাওয়া সারিগুলোকে একত্রিত করে এবং সেই গ্রুপের জন্য অ্যাগ্রিগেট ফিল্ডগুলো গণনা করে। উদাহরণস্বরূপ:

প্রশ্ন

query MostExpensiveProductByManufacturer {
  products {
  manufacturer
  price_max
  }
}

প্রতিক্রিয়া
groupedaggregates

উদাহরণস্বরূপ, যদি আপনার নিম্নলিখিত পণ্যগুলি থাকে:

  • পণ্য ক: manufacturer: "Acme" , price: 2.99
  • পণ্য বি: manufacturer: "Beta" , price: 5.99
  • পণ্য সি: manufacturer: "Acme" , price: 1.99

ফলাফলটি হবে:

{
  "products": [
    { "manufacturer": "Acme", "price_max": 2.99 },
    { "manufacturer": "Beta", "price_max": 5.99 }
  ]
}
having এবং where দলবদ্ধ সমষ্টির সাথে

আপনি having এবং where আর্গুমেন্ট ব্যবহার করে শুধুমাত্র সেইসব গ্রুপ ফেরত পেতে পারেন যেগুলো প্রদত্ত শর্ত পূরণ করে।

  • having আপনাকে গ্রুপগুলিকে তাদের সমষ্টিগত ফিল্ড অনুসারে ফিল্টার করার সুযোগ দেয়।
  • where আপনাকে নন-অ্যাগ্রিগেট ফিল্ডের উপর ভিত্তি করে সারিগুলো ফিল্টার করার সুযোগ দেওয়া হয়।

প্রশ্ন

query FilteredMostExpensiveProductByManufacturer {
  products(having: {price_max: {ge: 2.99}}) {
  manufacturer
  price_max
  }
}

প্রতিক্রিয়া
havingwhere

উদাহরণস্বরূপ, যদি আপনার নিম্নলিখিত পণ্যগুলি থাকে:

  • পণ্য ক: manufacturer: "Acme" , price: 2.99
  • পণ্য বি: manufacturer: "Beta" , price: 5.99
  • পণ্য সি: manufacturer: "Acme" , price: 1.99

ফলাফলটি হবে:

{
  "products": [
    { "manufacturer": "Acme", "price_max": 2.99 },
    { "manufacturer": "Beta", "price_max": 5.99 }
  ]
}

টেবিল জুড়ে সমষ্টি

আপনার ডেটা সম্পর্কে জটিল প্রশ্নের উত্তর দিতে, তৈরি করা ওয়ান-টু-মেনি রিলেশনশিপ ফিল্ডের সাথে একত্রে অ্যাগ্রিগেট ফিল্ড ব্যবহার করা যেতে পারে। এখানে একটি পরিবর্তিত স্কিমা দেওয়া হলো, যেখানে Manufacturer একটি আলাদা টেবিল রয়েছে, যা আমরা উদাহরণগুলিতে ব্যবহার করতে পারি:

  type Product @table {
    name: String!
    manufacturer: Manufacturer!
    quantityInStock: Int!
    price: Float!
    expirationDate: Date
  }

  type Manufacturer @table {
    name: String!
    headquartersCountry: String!
  }

এখন আমরা অ্যাগ্রিগেট ফিল্ড ব্যবহার করে কোনো উৎপাদক কতগুলো পণ্য তৈরি করে, তা খুঁজে বের করার মতো কাজ করতে পারি:

প্রশ্ন

query GetProductCount($id: UUID) {
  manufacturers {
    name
    products_on_manufacturer {
      _count
    }
  }
}

প্রতিক্রিয়া
aggregatesacrosstables

উদাহরণস্বরূপ, যদি আপনার নিম্নলিখিত নির্মাতারা থাকে:

  • প্রস্তুতকারক A: name: "Acme" , products_on_manufacturer: 2
  • প্রস্তুতকারক B: name: "Beta" , products_on_manufacturer: 1

ফলাফলটি হবে:

{
  "manufacturers": [
    { "name": "Acme", "products_on_manufacturer": { "_count": 2 } },
    { "name": "Beta", "products_on_manufacturer": { "_count": 1 } }
  ]
}

কোয়েরি গণনা ক্ষেত্র

আপনি আপনার স্কিমাতে এনুমারেশন ফিল্ডগুলো কোয়েরি করতে পারেন।

ধরে নিন আমাদের গণনাটি নিম্নরূপে বাস্তবায়িত হয়েছে:

enum AspectRatio {
   ACADEMY
   WIDESCREEN
   ANAMORPHIC
   IMAX
   "No information available on aspect ratio"
   UNAVAILABLE
}

উদাহরণস্বরূপ, আপনি আপনার পছন্দের অ্যাস্পেক্ট রেশিওতে ফরম্যাট করা সমস্ত সিনেমার তালিকা করতে পারেন।

query ListMoviesByAspectRatio($aspectRatio: AspectRatio!) @auth(level: PUBLIC) {
  movies(where:
    {originalAspectRatio: {eq: $aspectRatio}}
) {
    id
    title
    imageUrl
    releaseYear
    genre
    rating
    tags
    description
    otherAspectRatios
  }
}

গণনা ক্ষেত্রগুলি ফিল্টার করুন

Enum-এর জন্য eq , ne , ge , gt , lt , le , in nin মতো সাধারণ ফিল্টারিং অ্যাকশনগুলো উপলব্ধ আছে, এবং সেই সাথে লিস্টের জন্য includes , excludes , includesAllexcludesAll ও রয়েছে।

order এর ক্ষেত্রে, গ্রেটার এবং লেস-দ্যান অপারেটরগুলো অর্থপূর্ণ কার্য সম্পাদনের জন্য এনাম ভ্যালুগুলোর ক্রম ব্যবহার করে। এনামের শুরুর দিকের ভ্যালুগুলো, এনাম সংজ্ঞার শেষের দিকের ভ্যালুগুলোর চেয়ে ছোট হয়।

উদাহরণস্বরূপ, নিম্নলিখিত where ক্লজটি সেইসব মুভি ফেরত দেবে যাদের ratio ইনপুট অ্যাস্পেক্ট রেশিওর চেয়ে কম।

  • প্রথম উদাহরণে, যদি $aspectRatio IMAX হতো, তাহলে ACADEMY, WIDESCREEN, এবং ANAMORPHIC ratio সাথে মিলে যাওয়া সিনেমাগুলো নির্বাচিত হতো।
  • দ্বিতীয় উদাহরণে, শুধুমাত্র সেই সিনেমাগুলোই দেখানো হবে যেগুলো ACADEMY এবং WIDESCREEN উভয় ফরম্যাটেই উপলব্ধ।
  movies(where: {originalAspectRatio: {lt: $aspectRatio}})

  movies(where: {otherAspectRatios: {includesAll: [ACADEMY, WIDESCREEN]}})

গণনা ক্ষেত্রগুলিতে সমষ্টিগত কোয়েরি সম্পাদন করুন

এনামের জন্য শুধুমাত্র _count সমর্থিত।

নিম্নলিখিত কোয়েরিটি প্রতিটি অ্যাস্পেক্ট রেশিওর মোট সিনেমার সংখ্যা গণনা করে।

query MovieCountByOriginalAspectRatio @auth(level: PUBLIC) {
  movies {
    _count
    originalAspectRatio
  }
}

ক্লায়েন্ট কোড থেকে এনুমারেশন কোয়েরি কল করুন

iOS , Android , web এবং Flutter- এর SDK গাইডগুলো থেকে জানুন, কীভাবে ক্লায়েন্ট থেকে এনুমারেশন কোয়েরি ব্যবহার করতে হয় এবং এনুমারেশন ব্যবস্থাপনায় আপনার নমনীয়তা সর্বাধিক করার জন্য কীভাবে ক্লায়েন্ট কল ডিজাইন করতে হয়।

উন্নত কোয়েরি লিখুন: একাধিক ধাপে ডেটা পড়ার জন্য query ফিল্ড ব্যবহার করুন।

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

Data Connect এই কার্যকারিতা সমর্থন করে। একাধিক-ধাপের কার্যক্রম দেখুন।

পরবর্তী পদক্ষেপ

আপনি নিম্নলিখিত বিষয়গুলিতে আগ্রহী হতে পারেন: