کوئری های Data Connect را پیاده سازی کنید

Firebase Data Connect به شما امکان می دهد برای نمونه های PostgreSQL خود که با Google Cloud SQL مدیریت می شوند، رابط ایجاد کنید. این رابط‌ها ترکیبی از پرس و جو و جهش برای استفاده از داده‌های شما از طرح شما هستند.

راهنمای شروع یک طرح برنامه بررسی فیلم برای PostgreSQL معرفی شد.

آن راهنما همچنین عملیات اجرایی قابل استقرار و موقت، از جمله پرس و جوها را معرفی کرد.

  • پرس و جوهای قابل استقرار آنهایی هستند که برای تماس از برنامه های سرویس گیرنده، با نقاط پایانی API که شما تعریف می کنید، پیاده سازی می کنید. آنها را در یک رابط مستقر در سرور قرار می دهید. ابزار Data Connect SDK های مشتری را بر اساس API شما ایجاد می کند. جستارهای مستقر شده توسط خط مشی IAM محافظت نمی شوند، بنابراین مطمئن شوید که آنها را با استفاده از دستورالعمل Data Connect @auth ایمن کنید.
  • پرس و جوهای اداری موقت از محیط های دارای امتیاز برای خواندن داده ها اجرا می شوند. می توانید آنها را در کنسول Firebase یا در محیط های توسعه محلی با استفاده از افزونه Data Connect VS Code ایجاد و اجرا کنید.

این راهنما نگاه عمیق تری به پرس و جوهای قابل استقرار دارد.

ویژگی های پرس و جوهای Data Connect

Data Connect به شما امکان می دهد پرس و جوهای اساسی را به تمام روش هایی که از پایگاه داده PostgreSQL انتظار دارید انجام دهید.

اما با افزونه های Data Connect برای GraphQL، می توانید پرس و جوهای پیشرفته را برای برنامه های سریعتر و کارآمدتر پیاده سازی کنید:

  • از اسکالرهای کلیدی بازگردانده شده توسط بسیاری از عملیات برای ساده کردن عملیات تکراری روی رکوردها استفاده کنید
  • در طول عملیات جهش چند مرحله ای برای جستجوی داده ها، صرفه جویی در خطوط کد و رفت و برگشت به سرور، پرس و جوها را انجام دهید.

از فیلدهای ایجاد شده برای ساخت پرس و جو استفاده کنید

عملیات 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 }
    }
  }

عناصر ضروری یک پرس و جو

کوئری های Data Connect کوئری های GraphQL با پسوندهای Data Connect هستند. درست مانند یک پرس و جو معمولی GraphQL، می توانید نام عملیات و لیستی از متغیرهای GraphQL را تعریف کنید.

Data Connect پرس و جوهای GraphQL را با دستورالعمل های سفارشی مانند @auth گسترش می دهد.

بنابراین پرس و جو زیر دارد:

  • تعریف نوع 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 در مثال در حال اجرا، از یک آرگومان کلیدی پشتیبانی می‌کنند که یک اسکالر کلیدی را می‌پذیرد.

شما ممکن است یک اسکالر کلیدی را به صورت تحت اللفظی پاس کنید. اما، می توانید متغیرهایی را برای ارسال اسکالرهای کلیدی به عنوان ورودی تعریف کنید.

پرس و جو

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 از نام مستعار GraphQL در کوئری ها پشتیبانی می کند. با نام مستعار، نام داده هایی را که در نتایج یک پرس و جو برگردانده می شوند، تغییر می دهید. یک کوئری 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"
      }
    ]
  }
}
    

با آزمایش مقادیر تهی فیلتر کنید

می توانید مقادیر null را با استفاده از عملگر isNull تست کنید.

پرس و جو

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 syntax در فیلدهای خواندنی تولید شده استفاده می کنند.

به یاد داشته باشید که طرحواره نمونه را مرور کنید.

بسیاری به یک

اکنون به یک پرس و جو برای نشان دادن نحو _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
  • محصول B: 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
    }
  ]
}
_min و _max برای تاریخ ها و مهرهای زمانی

فیلدهای تاریخ و مهر زمان دارای <field>_min و <field>_max هستند.

پرس و جو

query DateAndTimeAggregates {
  products {
  expirationDate_max
  expirationDate_min
  }
}

پاسخ
_min _maxdatetime

به عنوان مثال، اگر تاریخ انقضای زیر را دارید:

  • محصول A: 2024-01-01
  • محصول B: 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"
  • محصول B: manufacturer: "Beta"
  • محصول C: manufacturer: "Acme"

نتیجه این خواهد بود:

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

همچنین می توانید از آرگومان distinct در فیلدهای انبوه استفاده کنید تا به جای آن مقادیر متمایز را جمع آوری کنید. به عنوان مثال:

پرس و جو

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

پاسخ
distinctonaggregate

به عنوان مثال، اگر تولید کنندگان زیر را دارید:

  • محصول A: manufacturer: "Acme"
  • محصول B: manufacturer: "Beta"
  • محصول C: manufacturer: "Acme"

نتیجه این خواهد بود:

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

مصالح گروه بندی شده

شما با انتخاب ترکیبی از فیلدهای انبوه و غیرتجمیع روی یک نوع، یک مجموعه گروه بندی شده را انجام می دهید. این همه ردیف‌های منطبق را که مقدار یکسانی برای فیلدهای غیرمجموعه دارند را با هم گروه‌بندی می‌کند و فیلدهای انبوه را برای آن گروه محاسبه می‌کند. به عنوان مثال:

پرس و جو

query MostExpensiveProductByManufacturer {
  products {
  manufacturer
  price_max
  }
}

پاسخ
groupedaggregates

به عنوان مثال، اگر محصولات زیر را دارید:

  • محصول A: manufacturer: "Acme" ، price: 2.99
  • محصول B: 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 and where فقط برای برگرداندن گروه‌هایی که معیارهای ارائه شده را دارند استفاده کنید.

  • having به شما امکان می دهد گروه ها را بر اساس فیلدهای انبوه آنها فیلتر کنید
  • where به شما امکان می دهد ردیف ها را بر اساس فیلدهای غیرتجمعی فیلتر کنید.

پرس و جو

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

پاسخ
havingwhere

به عنوان مثال، اگر محصولات زیر را دارید:

  • محصول A: manufacturer: "Acme" ، price: 2.99
  • محصول B: 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
  • سازنده B: name: "Beta" ، products_on_manufacturer: 1

نتیجه این خواهد بود:

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

نوشتن پرس و جوهای پیشرفته: از فیلدهای query برای خواندن داده ها در عملیات چند مرحله ای استفاده کنید

موقعیت‌های زیادی وجود دارد که ممکن است بخواهید پایگاه داده خود را در حین اجرای یک جهش بخوانید تا قبل از انجام، به عنوان مثال، درج یا به‌روزرسانی، داده‌های موجود را جستجو و تأیید کنید. این گزینه ها باعث صرفه جویی در عملیات رفت و برگشت و در نتیجه هزینه ها می شود.

Data Connect از این قابلیت پشتیبانی می کند. عملیات چند مرحله ای را ببینید.

مراحل بعدی

ممکن است علاقه مند باشید: