Triển khai truy vấn Data Connect

Firebase Data Connect cho phép bạn tạo trình kết nối cho các phiên bản PostgreSQL được quản lý bằng Google Cloud SQL. Các trình kết nối này là sự kết hợp của các truy vấn và đột biến để sử dụng dữ liệu của bạn từ giản đồ.

Hướng dẫn bắt đầu đã giới thiệu một giản đồ ứng dụng đánh giá phim cho PostgreSQL.

Hướng dẫn đó cũng giới thiệu cả các thao tác quản trị có thể triển khai và đặc biệt, bao gồm cả các truy vấn.

  • Truy vấn có thể triển khai là những truy vấn mà bạn triển khai để gọi từ các ứng dụng khách, với những điểm cuối API mà bạn xác định. Bạn sẽ kết hợp các thành phần này thành một trình kết nối được triển khai đến máy chủ. Công cụ Data Connect tạo ra các SDK ứng dụng dựa trên API của bạn. Các truy vấn đã triển khai không được bảo vệ theo chính sách IAM, vì vậy, hãy nhớ bảo mật các truy vấn đó bằng chỉ thị Data Connect @auth.
  • Các truy vấn quản trị đặc biệt được chạy từ các môi trường đặc quyền để đọc dữ liệu. Bạn có thể tạo và thực thi các thao tác này trong bảng điều khiển Firebase hoặc trong môi trường phát triển cục bộ bằng cách sử dụng tiện ích Data Connect VS Code của chúng tôi.

Hướng dẫn này xem xét kỹ hơn về các truy vấn có thể triển khai.

Đặc điểm của truy vấn Data Connect

Data Connect cho phép bạn thực hiện các truy vấn cơ bản theo mọi cách mà bạn mong đợi khi có cơ sở dữ liệu PostgreSQL.

Nhưng với các tiện ích của Data Connect đối với GraphQL, bạn có thể triển khai các truy vấn nâng cao cho các ứng dụng nhanh hơn và hiệu quả hơn:

  • Sử dụng các đại lượng vô hướng khoá do nhiều thao tác trả về để đơn giản hoá các thao tác lặp lại trên bản ghi
  • Thực hiện các truy vấn trong quá trình thực hiện các thao tác đột biến nhiều bước để tra cứu dữ liệu, lưu các dòng mã và chuyến đi khứ hồi đến máy chủ.

Sử dụng các trường được tạo để tạo truy vấn

Các thao tác Data Connect sẽ mở rộng một tập hợp các trường Data Connect được tạo tự động dựa trên các loại và mối quan hệ loại trong giản đồ của bạn. Các trường này được tạo bằng công cụ cục bộ bất cứ khi nào bạn chỉnh sửa giản đồ.

Bạn có thể sử dụng các trường được tạo để triển khai các truy vấn ngày càng phức tạp, từ việc truy xuất các bản ghi riêng lẻ hoặc nhiều bản ghi từ các bảng đơn lẻ đến nhiều bản ghi từ các bảng có liên quan.

Giả sử giản đồ của bạn chứa một loại Movie và một loại Actor được liên kết. Data Connect tạo ra các trường movie, movies, actors_on_movies và nhiều trường khác.

Truy vấn bằng trường
movie

Trường movie biểu thị một bản ghi duy nhất trong bảng Movie.

Sử dụng trường này để truy vấn một bộ phim theo khoá.

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

Truy vấn bằng trường
movies

Trường movies biểu thị danh sách các bản ghi trong bảng Movie.

Sử dụng trường này để truy vấn nhiều phim, chẳng hạn như tất cả các phim có một năm phát hành nhất định.

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

Truy vấn bằng trường
actors_on_movies

Trường actors_on_movies đại diện cho danh sách các bản ghi kết nối bảng ActorMovie. Sử dụng trường này để truy vấn tất cả diễn viên liên quan đến một bộ phim nhất định.

Sử dụng trường này để truy vấn tất cả diễn viên liên quan đến một bộ phim nhất định.

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

Các phần tử thiết yếu của một truy vấn

Truy vấn Data Connect là truy vấn GraphQL có các tiện ích Data Connect. Giống như truy vấn GraphQL thông thường, bạn có thể xác định tên thao tác và danh sách các biến GraphQL.

Data Connect mở rộng các truy vấn GraphQL bằng các chỉ thị tuỳ chỉnh như @auth.

Vì vậy, truy vấn sau có:

  • Định nghĩa kiểu query
  • Tên của một thao tác ListMoviesByGenre (truy vấn)
  • Một đối số truy vấn duy nhất, ở đây là một biến $genre thuộc kiểu String
  • Một chỉ thị duy nhất, @auth.
  • Một trường duy nhất, movies.
query ListMoviesByGenre($genre: String!) @auth(level: PUBLIC) {
  movies(where: { genre: { eq: $genre } }) {
    id
    title
  }
}

Mọi đối số truy vấn đều yêu cầu một khai báo kiểu, một kiểu tích hợp sẵn như String hoặc một kiểu tuỳ chỉnh do lược đồ xác định như Movie.

Hướng dẫn này sẽ xem xét chữ ký của các truy vấn ngày càng phức tạp. Bạn sẽ kết thúc bằng cách giới thiệu các biểu thức mối quan hệ mạnh mẽ, ngắn gọn mà bạn có thể sử dụng để tạo các truy vấn có thể triển khai.

Các đại lượng vô hướng chính trong truy vấn

Nhưng trước tiên, hãy lưu ý về các đại lượng vô hướng chính.

Data Connect xác định một khoá vô hướng đặc biệt để biểu thị khoá chính của mỗi bảng, được xác định bằng {TableType}_Key. Đây là một đối tượng JSON gồm các giá trị khoá chính.

Bạn truy xuất các đại lượng vô hướng chính dưới dạng phản hồi do hầu hết các trường đọc được tạo tự động trả về, hoặc tất nhiên là từ các truy vấn mà bạn đã truy xuất tất cả các trường cần thiết để tạo khoá vô hướng.

Các truy vấn tự động đơn lẻ, chẳng hạn như movie trong ví dụ đang chạy của chúng tôi, hỗ trợ một đối số khoá chấp nhận một đại lượng vô hướng khoá.

Bạn có thể truyền một đại lượng vô hướng khoá dưới dạng một chữ. Nhưng bạn có thể xác định các biến để truyền các đại lượng vô hướng khoá làm đầu vào.

Truy vấn

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

Phản hồi

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

Bạn có thể cung cấp các thông tin này trong JSON yêu cầu như sau (hoặc các định dạng tuần tự hoá khác):

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

Nhờ tính năng phân tích cú pháp vô hướng tuỳ chỉnh, bạn cũng có thể tạo Movie_Key bằng cú pháp đối tượng, có thể chứa các biến. Điều này chủ yếu hữu ích khi bạn muốn chia các thành phần riêng lẻ thành nhiều biến vì một lý do nào đó.

Viết các truy vấn cơ bản

Bạn có thể bắt đầu viết các truy vấn để lấy từng bản ghi trong cơ sở dữ liệu hoặc liệt kê các bản ghi trong một bảng với lựa chọn giới hạn và sắp xếp kết quả.

Truy xuất từng bản ghi

Truy vấn đơn giản nhất sẽ nhận được một bản ghi duy nhất theo mã nhận dạng. Cụm từ tìm kiếm của bạn sẽ sử dụng trường movie được tạo tự động.

Truy vấn

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

Phản hồi

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

Truy xuất tất cả các bản ghi trong một bảng

Để truy xuất một tập hợp con các trường cho danh sách đầy đủ các bộ phim trong bảng Movies, truy vấn của bạn sẽ sử dụng trường movies được tạo tự động và quá trình triển khai của bạn có thể trông như sau.

Truy vấn

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

Phản hồi

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

Sử dụng các toán tử orderBy, limitoffset

Tất nhiên, việc liệt kê tất cả các bản ghi trong một bảng sẽ có ít tác dụng.

Bạn có thể sắp xếp và phân trang kết quả. Những đối số này được chấp nhận nhưng không được trả về trong kết quả.

Ở đây, truy vấn sẽ nhận được tiêu đề của 10 bộ phim hàng đầu theo mức phân loại.

Truy vấn

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

Phản hồi

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

Bạn có thể có một trường hợp sử dụng để tìm nạp các hàng từ một khoảng bù trừ, chẳng hạn như các bộ phim từ 11 đến 20 được sắp xếp theo mức phân loại.

Truy vấn

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

Phản hồi

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

Sử dụng biệt hiệu trong truy vấn

Data Connect hỗ trợ việc đặt biệt hiệu GraphQL trong các truy vấn. Với bí danh, bạn có thể đổi tên dữ liệu được trả về trong kết quả của một truy vấn. Một truy vấn Data Connect duy nhất có thể áp dụng nhiều bộ lọc hoặc các thao tác truy vấn khác trong một yêu cầu hiệu quả gửi đến máy chủ, nhờ đó phát hành đồng thời một số "truy vấn phụ". Để tránh xảy ra xung đột tên trong tập dữ liệu được trả về, bạn có thể dùng các bí danh để phân biệt các truy vấn phụ.

Sau đây là một truy vấn trong đó biểu thức sử dụng các bí danh mostPopularleastPopular.

Truy vấn

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

Phản hồi

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

Sử dụng bộ lọc truy vấn

Truy vấn Data Connect ánh xạ đến tất cả các bộ lọc và thao tác sắp xếp SQL thông thường.

Lọc bằng where bằng toán tử orderBy

Trả về tất cả các hàng khớp trong bảng (và các mối liên kết lồng nhau). Trả về một mảng trống nếu không có bản ghi nào khớp với bộ lọc.

Truy vấn

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

Phản hồi

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

Lọc bằng cách kiểm tra giá trị rỗng

Bạn có thể kiểm thử các giá trị null bằng cách sử dụng toán tử isNull.

Truy vấn

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

Phản hồi

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

Để biết thêm các toán tử, hãy xem hướng dẫn tham khảo về các loại đối tượng đầu vào.

Lọc bằng cách so sánh giá trị

Bạn có thể sử dụng các toán tử như lt (nhỏ hơn) và ge (lớn hơn hoặc bằng) để so sánh các giá trị trong truy vấn.

Truy vấn

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

Phản hồi

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

Lọc bằng toán tử includesexcludes cho các trường mảng

Bạn có thể kiểm tra để đảm bảo rằng một trường mảng có chứa một mục được chỉ định.

Ví dụ sau đây minh hoạ toán tử includes.

Data Connect hỗ trợ includesAll, excludes, excludesAll và nhiều phương thức khác. Xem tất cả các toán tử như vậy cho số nguyên, chuỗi, ngày và các loại dữ liệu khác trong tiêu đề _ListFilter của tài liệu tham khảo.

Truy vấn

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

Phản hồi

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

Lọc bằng các thao tác chuỗi và biểu thức chính quy

Các truy vấn của bạn có thể sử dụng các thao tác so sánh và tìm kiếm chuỗi thông thường, bao gồm cả biểu thức chính quy. Lưu ý rằng để tăng hiệu quả, bạn đang kết hợp một số thao tác tại đây và phân biệt chúng bằng các bí danh.

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}}) {...}
}

Lọc bằng logic toán tử _or, _and, _not

Sử dụng _or cho logic phức tạp hơn. Data Connect cũng hỗ trợ các toán tử _and_not.

Truy vấn

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

Phản hồi

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

Viết truy vấn quan hệ

Các truy vấn Data Connect có thể truy cập vào dữ liệu dựa trên mối quan hệ giữa các bảng. Bạn có thể sử dụng mối quan hệ đối tượng (một-một) hoặc mối quan hệ mảng (một-nhiều) được xác định trong giản đồ để thực hiện các truy vấn lồng nhau, tức là tìm nạp dữ liệu cho một loại cùng với dữ liệu từ một loại lồng nhau hoặc có liên quan.

Các truy vấn như vậy sử dụng cú pháp Data Connect _on__via đặc biệt trong các trường đọc được tạo.

Hãy nhớ xem lại sơ đồ mẫu.

Nhiều với một

Bây giờ, hãy xem một truy vấn minh hoạ cú pháp _on_.

Truy vấn

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

Phản hồi

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

Tỷ lệ 1:1

Bạn có thể viết một truy vấn một đối một bằng cách sử dụng cú pháp _on_.

Truy vấn

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

Phản hồi

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

Nhiều với nhiều

Truy vấn nhiều-nhiều sử dụng cú pháp _via_. Một truy vấn nhiều-nhiều có thể truy xuất các diễn viên cho một bộ phim cụ thể.

Truy vấn

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

Phản hồi

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

Tuy nhiên, chúng ta có thể viết một truy vấn phức tạp hơn bằng cách sử dụng các bí danh để lọc dựa trên role nhằm truy xuất diễn viên và các bộ phim liên quan trong kết quả mainActorssupportingActors. Vì đây là mối quan hệ nhiều với nhiều, nên cú pháp _via_ được dùng.

Truy vấn

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

Phản hồi

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

Truy vấn tổng hợp

Tập hợp là gì và tại sao nên sử dụng tập hợp?

Các trường tổng hợp cho phép bạn thực hiện các phép tính trên một danh sách kết quả. Với các trường tổng hợp, bạn có thể làm những việc như:

  • Tìm điểm trung bình của một bài đánh giá
  • Tìm tổng chi phí của các mặt hàng trong giỏ hàng
  • Tìm sản phẩm được xếp hạng cao nhất hoặc thấp nhất
  • Đếm số lượng sản phẩm trong cửa hàng

Các hoạt động tổng hợp được thực hiện trên máy chủ, mang lại một số lợi ích so với việc tính toán ở phía máy khách:

  • Hiệu suất ứng dụng nhanh hơn (vì bạn tránh được các phép tính phía máy khách)
  • Giảm chi phí truyền dữ liệu (vì bạn chỉ gửi kết quả tổng hợp thay vì tất cả dữ liệu đầu vào)
  • Nâng cao tính bảo mật (vì bạn có thể cấp cho các ứng dụng quyền truy cập vào dữ liệu tổng hợp thay vì toàn bộ tập dữ liệu)

Ví dụ về giản đồ cho các giá trị tổng hợp

Trong phần này, chúng ta sẽ chuyển sang một giản đồ ví dụ về cửa hàng. Đây là một giản đồ phù hợp để giải thích cách sử dụng các hàm tổng hợp:

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

Tổng hợp đơn giản

_count cho tất cả các trường

Trường tổng hợp đơn giản nhất là _count: trường này trả về số lượng hàng khớp với truy vấn của bạn. Đối với mỗi trường trong loại của bạn, Data Connect sẽ tạo các trường tổng hợp tương ứng tuỳ thuộc vào loại trường.

Truy vấn

query CountProducts {
  products {
    _count
  }
}

Phản hồi
one

Ví dụ: nếu bạn có 5 sản phẩm trong cơ sở dữ liệu, thì kết quả sẽ là:

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

Tất cả các trường đều có trường <field>_count, trường này đếm số lượng hàng có giá trị khác rỗng trong trường đó.

Truy vấn

query CountProductsWithExpirationDate {
  products {
    expirationDate_count
  }
}

Phản hồi
field_count

Ví dụ: nếu bạn có 3 sản phẩm có ngày hết hạn, thì kết quả sẽ là:

{
  "products": [
    {
    "expirationDate_count": 3
    }
  ]
}
_min, _max, _sum và _avg cho các trường số

Các trường số (int, float, int64) cũng có <field>_min, <field>_max, <field>_sum<field>_avg.

Truy vấn

query NumericAggregates {
  products {
  quantityInStock_max
  price_min
  price_avg
  quantityInStock_sum
  }
}

Phản hồi
_min _max _sum _avg

Ví dụ: nếu bạn có các sản phẩm sau:

  • Sản phẩm A: quantityInStock: 10, price: 2.99
  • Sản phẩm B: quantityInStock: 5, price: 5.99
  • Sản phẩm C: quantityInStock: 20, price: 1.99

Kết quả sẽ là:

{
  "products": [
    {
    "quantityInStock_max": 20,
    "price_min": 1.99,
    "price_avg": 3.6566666666666666,
    "quantityInStock_sum": 35
    }
  ]
}
_min và _max cho ngày và dấu thời gian

Các trường ngày và dấu thời gian có <field>_min<field>_max.

Truy vấn

query DateAndTimeAggregates {
  products {
  expirationDate_max
  expirationDate_min
  }
}

Phản hồi
_min _maxdatetime

Ví dụ: nếu bạn có các ngày hết hạn sau:

  • Sản phẩm A: 2024-01-01
  • Sản phẩm B: 2024-03-01
  • Sản phẩm C: 2024-02-01

Kết quả sẽ là:

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

Riêng biệt

Đối số distinct cho phép bạn nhận tất cả các giá trị riêng biệt cho một trường (hoặc tổ hợp các trường). Ví dụ:

Truy vấn

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

Phản hồi
distinct

Ví dụ: nếu bạn có các nhà sản xuất sau:

  • Sản phẩm A: manufacturer: "Acme"
  • Sản phẩm B: manufacturer: "Beta"
  • Sản phẩm C: manufacturer: "Acme"

Kết quả sẽ là:

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

Bạn cũng có thể sử dụng đối số distinct trên các trường tổng hợp để tổng hợp các giá trị riêng biệt. Ví dụ:

Truy vấn

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

Phản hồi
distinctonaggregate

Ví dụ: nếu bạn có các nhà sản xuất sau:

  • Sản phẩm A: manufacturer: "Acme"
  • Sản phẩm B: manufacturer: "Beta"
  • Sản phẩm C: manufacturer: "Acme"

Kết quả sẽ là:

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

Tập hợp theo nhóm

Bạn thực hiện một phép tổng hợp theo nhóm bằng cách chọn kết hợp các trường tổng hợp và không tổng hợp trên một loại. Thao tác này sẽ nhóm tất cả các hàng khớp có cùng giá trị cho các trường không tổng hợp và tính toán các trường tổng hợp cho nhóm đó. Ví dụ:

Truy vấn

query MostExpensiveProductByManufacturer {
  products {
  manufacturer
  price_max
  }
}

Phản hồi
groupedaggregates

Ví dụ: nếu bạn có các sản phẩm sau:

  • Sản phẩm A: manufacturer: "Acme", price: 2.99
  • Sản phẩm B: manufacturer: "Beta", price: 5.99
  • Sản phẩm C: manufacturer: "Acme", price: 1.99

Kết quả sẽ là:

{
  "products": [
    { "manufacturer": "Acme", "price_max": 2.99 },
    { "manufacturer": "Beta", "price_max": 5.99 }
  ]
}
havingwhere có các giá trị tổng hợp được nhóm

Bạn cũng có thể sử dụng đối số havingwhere để chỉ trả về những nhóm đáp ứng một tiêu chí được cung cấp.

  • having cho phép bạn lọc các nhóm theo các trường tổng hợp của nhóm
  • where cho phép bạn lọc các hàng dựa trên các trường không tổng hợp.

Truy vấn

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

Phản hồi
havingwhere

Ví dụ: nếu bạn có các sản phẩm sau:

  • Sản phẩm A: manufacturer: "Acme", price: 2.99
  • Sản phẩm B: manufacturer: "Beta", price: 5.99
  • Sản phẩm C: manufacturer: "Acme", price: 1.99

Kết quả sẽ là:

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

Tổng hợp trên các bảng

Bạn có thể sử dụng các trường tổng hợp cùng với các trường mối quan hệ một-nhiều được tạo để trả lời các câu hỏi phức tạp về dữ liệu của mình. Sau đây là giản đồ đã sửa đổi, có bảng riêng biệt Manufacturer mà chúng ta có thể sử dụng trong các ví dụ:

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

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

Giờ đây, chúng ta có thể sử dụng các trường tổng hợp để làm những việc như tìm hiểu xem một nhà sản xuất tạo ra bao nhiêu sản phẩm:

Truy vấn

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

Phản hồi
aggregatesacrosstables

Ví dụ: nếu bạn có các nhà sản xuất sau:

  • Nhà sản xuất A: name: "Acme", products_on_manufacturer: 2
  • Nhà sản xuất B: name: "Beta", products_on_manufacturer: 1

Kết quả sẽ là:

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

Viết truy vấn nâng cao: sử dụng các trường query để đọc dữ liệu trong các thao tác nhiều bước

Có nhiều trường hợp bạn có thể muốn đọc cơ sở dữ liệu trong quá trình thực thi một đột biến để tra cứu và xác minh dữ liệu hiện có trước khi thực hiện, ví dụ: chèn hoặc cập nhật. Các lựa chọn này giúp tiết kiệm các thao tác khứ hồi và do đó tiết kiệm chi phí.

Data Connect hỗ trợ chức năng này. Xem các thao tác nhiều bước.

Các bước tiếp theo

Bạn có thể quan tâm đến: