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

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

শুরু করার নির্দেশিকাটি PostgreSQL-এর জন্য একটি মুভি রিভিউ অ্যাপ স্কিমা চালু করেছে।

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

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

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

Data Connect কোয়েরির বৈশিষ্ট্য

Data Connect আপনাকে PostgreSQL ডাটাবেসের ক্ষেত্রে আপনার প্রত্যাশা অনুযায়ী সকল ধরণের মৌলিক প্রশ্ন সম্পাদন করতে দেয়।

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

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

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

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

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

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

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

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

একটি সিনেমার কী ব্যবহার করে জিজ্ঞাসা করতে এই ক্ষেত্রটি ব্যবহার করুন।

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 }
    }
  }

একটি প্রশ্নের অপরিহার্য উপাদান

ডেটা কানেক্ট কোয়েরি হলো ডেটা কানেক্ট এক্সটেনশন সহ গ্রাফকিউএল কোয়েরি। নিয়মিত গ্রাফকিউএল কোয়েরির মতো, আপনি একটি অপারেশনের নাম এবং গ্রাফকিউএল ভেরিয়েবলের একটি তালিকা সংজ্ঞায়িত করতে পারেন।

ডেটা কানেক্ট @auth এর মতো কাস্টমাইজড নির্দেশিকা সহ GraphQL কোয়েরিগুলিকে প্রসারিত করে।

তাহলে নিম্নলিখিত প্রশ্নের মধ্যে রয়েছে:

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

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

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

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

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

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

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

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

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

প্রশ্ন

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 ফিল্টার এবং অর্ডার অপারেশনগুলিতে ম্যাপ করে।

অপারেটরদের orderBy দিয়ে where দিয়ে ফিল্টার করুন

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

প্রশ্ন

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"
        }
      ]
    }
  }
}
    

কিন্তু আমরা আরও জটিল একটি কোয়েরি লিখতে পারি, উপনাম ব্যবহার করে, mainActors এবং supportingActors ফলাফলে অভিনেতা এবং সংশ্লিষ্ট সিনেমাগুলি পুনরুদ্ধার করার জন্য role উপর ভিত্তি করে ফিল্টার করতে। যেহেতু এটি many-to-many, তাই _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 ক্ষেত্র থাকে, যা গণনা করে যে কতগুলি সারির একটি নন-নাল মান আছে।

প্রশ্ন

query CountProductsWithExpirationDate {
  products {
    expirationDate_count
  }
}

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

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

{
  "products": [
    {
    "expirationDate_count": 3
    }
  ]
}
সংখ্যাসূচক ক্ষেত্রের জন্য _মিনিট, _সর্বোচ্চ, _সমষ্টি, এবং _গড়

সংখ্যাসূচক ক্ষেত্রগুলিতে (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

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

  • পণ্য A: quantityInStock: 10 , price: 2.99
  • পণ্য B: 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
    }
  ]
}
তারিখ এবং টাইমস্ট্যাম্পের জন্য _মিনিট এবং _সর্বোচ্চ

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

প্রশ্ন

query DateAndTimeAggregates {
  products {
  expirationDate_max
  expirationDate_min
  }
}

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

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

  • পণ্য A: 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

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

  • পণ্য A: 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

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

  • পণ্য A: 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 , includesAll এবং excludesAll

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

উদাহরণস্বরূপ, নিম্নলিখিত where clause ইনপুট আকৃতির অনুপাতের চেয়ে কম 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 এই কার্যকারিতা সমর্থন করে। বহু-পদক্ষেপের ক্রিয়াকলাপ দেখুন।

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

আপনার আগ্রহ থাকতে পারে: