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

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

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

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

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

این راهنما نگاه عمیق‌تری به کوئری‌های قابل استقرار (deployable query) می‌اندازد.

ویژگی‌های کوئری‌های 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 را به هم متصل می‌کنند. از این فیلد برای جستجوی تمام Actorهای مرتبط با یک فیلم مشخص استفاده کنید.

از این فیلد برای جستجوی تمام بازیگران مرتبط با یک فیلم مشخص استفاده کنید.

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

ممکن است موردی برای دریافت ردیف‌ها از یک آفست داشته باشید، مانند فیلم‌های ۱۱ تا ۲۰ که بر اساس رتبه‌بندی مرتب شده‌اند.

پرس و جو

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 و عملیات سفارش‌دهی نگاشت می‌شوند.

فیلتر با 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 برای همه فیلدها

ساده‌ترین فیلد تجمیعی، _count است: این فیلد تعداد ردیف‌های منطبق با پرس‌وجوی شما را برمی‌گرداند. برای هر فیلد در نوع شما، Data Connect بسته به نوع فیلد، فیلدهای تجمیعی مربوطه را تولید می‌کند.

پرس و جو

query CountProducts {
  products {
    _count
  }
}

پاسخ
one

برای مثال، اگر ۵ محصول در پایگاه داده خود داشته باشید، نتیجه به صورت زیر خواهد بود:

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

همه فیلدها یک فیلد <field>_count دارند که تعداد ردیف‌هایی را که مقدار غیر تهی در آن فیلد دارند، می‌شمارد.

پرس و جو

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
  • محصول 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

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

  • محصول الف: 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"
  • محصول 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

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

  • محصول الف: 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 و where برای برگرداندن گروه‌هایی که معیارهای ارائه شده را برآورده می‌کنند، استفاده کنید.

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

پرس و جو

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

پاسخ
havingwhere

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

  • محصول الف: 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 } }
  ]
}

فیلدهای شمارشی پرس و جو

می‌توانید فیلدهای شمارشی را در طرحواره خود جستجو کنید.

فرض کنید شمارش ما به صورت زیر پیاده‌سازی شده است:

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 ، عملگرهای بزرگتر و کوچکتر از ترتیب مقادیر enum برای اجرای معنادار استفاده می‌کنند. مقادیر در ابتدای enum کوچکتر از مقادیر در انتهای تعریف enum هستند.

برای مثال، عبارت where زیر تمام فیلم‌هایی را که ratio آنها کمتر از نسبت تصویر ورودی است، برمی‌گرداند.

  • در مثال اول، اگر $aspectRatio برابر با IMAX باشد، فیلم‌هایی با ratio منطبق با ACADEMY، WIDESCREEN و ANAMORPHIC انتخاب می‌شوند.
  • در مثال دوم، فقط فیلم‌هایی که هم در ACADEMY و هم در WIDESCREEN موجود باشند، بازگردانده می‌شوند.
  movies(where: {originalAspectRatio: {lt: $aspectRatio}})

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

انجام پرس‌وجوهای تجمیعی روی فیلدهای شمارشی

فقط _count برای enumها پشتیبانی می‌شود.

کوئری زیر تعداد کل فیلم‌های هر نسبت ابعاد را شمارش می‌کند.

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

فراخوانی کوئری‌های شمارش از کد کلاینت

در راهنماهای SDK برای iOS ، اندروید ، وب و فلاتر ، نحوه استفاده از کوئری‌های شمارشی از کلاینت‌ها و نحوه طراحی فراخوانی‌های کلاینت برای به حداکثر رساندن انعطاف‌پذیری در مدیریت شمارش‌ها را بیاموزید.

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

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

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

مراحل بعدی

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