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

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

শুরু করুন গাইড PostgreSQL-এর জন্য একটি মুভি পর্যালোচনা অ্যাপ স্কিমা প্রবর্তন করেছে।

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

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

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

Data Connect প্রশ্নের বৈশিষ্ট্য

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

কিন্তু 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 অপারেটর ব্যবহার করুন

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

আপনি অর্ডার করতে পারেন এবং ফলাফলের উপর পৃষ্ঠা সংখ্যা করতে পারেন। এই যুক্তি গৃহীত হয় কিন্তু ফলাফল ফিরে না.

এখানে, ক্যোয়ারী রেটিং দ্বারা শীর্ষ 10 সিনেমার শিরোনাম পায়।

প্রশ্ন

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

একটি অফসেট থেকে সারি আনার জন্য আপনার কাছে একটি ব্যবহারের ক্ষেত্রে থাকতে পারে, যেমন 11-20 রেটিংয়ের মাধ্যমে সাজানো সিনেমা।

প্রশ্ন

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 ক্যোয়ারী সমস্ত সাধারণ এসকিউএল ফিল্টার এবং অর্ডার অপারেশনে ম্যাপ করে।

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

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

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

সমস্ত ক্ষেত্রের একটি <field>_count ক্ষেত্র রয়েছে, যা সেই ক্ষেত্রে কতগুলি সারি অ-নাল মান আছে তা গণনা করে।

প্রশ্ন

query CountProductsWithExpirationDate {
  products {
    expirationDate_count
  }
}

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

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

{
  "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

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

  • পণ্য A: quantityInStock: 10 , price: 2.99
  • পণ্য বি: quantityInStock: 5 , price: 5.99
  • পণ্য C: 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
  • পণ্য C: 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
  • পণ্য C: 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
  • পণ্য C: 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
  • নির্মাতা বি: name: "Beta" , products_on_manufacturer: 1

ফলাফল হবে:

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

উন্নত প্রশ্নগুলি লিখুন: বহু-পদক্ষেপ ক্রিয়াকলাপে ডেটা পড়ার জন্য query ক্ষেত্রগুলি ব্যবহার করুন৷

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

Data Connect এই কার্যকারিতা সমর্থন করে। বহু-পদক্ষেপ অপারেশন দেখুন।

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

আপনি আগ্রহী হতে পারে: