Data Connect क्वेरी लागू करना

Firebase Data Connect की मदद से, Google Cloud SQL से मैनेज किए जाने वाले PostgreSQL इंस्टेंस के लिए कनेक्टर बनाए जा सकते हैं. ये कनेक्टर, क्वेरी और म्यूटेशन के कॉम्बिनेशन होते हैं. इनका इस्तेमाल, आपके स्कीमा से डेटा का इस्तेमाल करने के लिए किया जाता है.

शुरू करने के लिए गाइड में, PostgreSQL के लिए फ़िल्म की समीक्षा करने वाले ऐप्लिकेशन के स्कीमा के बारे में बताया गया है.

उस गाइड में, डिप्लॉय की जा सकने वाली और ऐड हॉक एडमिन कार्रवाइयों के बारे में भी बताया गया था. इनमें क्वेरी भी शामिल हैं.

  • डप्लॉय की जा सकने वाली क्वेरी वे होती हैं जिन्हें क्लाइंट ऐप्लिकेशन से कॉल करने के लिए लागू किया जाता है. इनमें आपके तय किए गए एपीआई एंडपॉइंट होते हैं. इन्हें सर्वर पर डिप्लॉय किए गए कनेक्टर में बंडल किया जाता है. Data Connect टूलिंग, आपके एपीआई के आधार पर क्लाइंट एसडीके जनरेट करती है. डिप्लॉय की गई क्वेरी, आईएएम नीति के तहत सुरक्षित नहीं होती हैं. इसलिए, उन्हें 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 }
    }
  }

क्वेरी के ज़रूरी एलिमेंट

डेटा कनेक्ट क्वेरी, डेटा कनेक्ट एक्सटेंशन वाली GraphQL क्वेरी होती हैं. सामान्य GraphQL क्वेरी की तरह ही, ऑपरेशन का नाम और GraphQL वैरिएबल की सूची तय की जा सकती है.

Data Connect, GraphQL क्वेरी को पसंद के मुताबिक बनाए गए निर्देशों के साथ बढ़ाता है. जैसे, @auth.

इसलिए, इस क्वेरी में ये शामिल हैं:

  • 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 क्वेरी में 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 क्वेरी, सभी सामान्य एसक्यूएल फ़िल्टर और क्रम बदलने की कार्रवाइयों से मैप होती हैं.

orderBy ऑपरेटर के साथ where का इस्तेमाल करके फ़िल्टर करना

यह टेबल (और नेस्ट किए गए असोसिएशन) से मैच होने वाली सभी पंक्तियां दिखाता है. अगर कोई रिकॉर्ड फ़िल्टर से मेल नहीं खाता है, तो खाली कलेक्शन दिखाता है.

क्वेरी

query MovieByTopRating($genre: String) {
  mostPopular: movies(
    where: { genre: { eq: $genre } },
    orderBy: { rating: DESC }
  ) {
    # graphql: list the fields from the results to return
    id
    title
    genre
    description
  }
}
    

जवाब

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

शून्य वैल्यू की जांच करके फ़िल्टर करना

isNull ऑपरेटर का इस्तेमाल करके, null वैल्यू की जांच की जा सकती है.

क्वेरी

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

जवाब

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

ज़्यादा ऑपरेटर के लिए, इनपुट ऑब्जेक्ट टाइप की रेफ़रंस गाइड देखें.

वैल्यू की तुलना करके फ़िल्टर करना

अपनी क्वेरी में वैल्यू की तुलना करने के लिए, lt (इससे कम) और ge (इससे ज़्यादा या इसके बराबर) जैसे ऑपरेटर इस्तेमाल किए जा सकते हैं.

क्वेरी

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

जवाब

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

ऐरे फ़ील्ड के लिए, includes और excludes ऑपरेटर का इस्तेमाल करके फ़िल्टर करना

यह जांच की जा सकती है कि किसी ऐरे फ़ील्ड में, तय किया गया आइटम शामिल है या नहीं.

यहां दिए गए उदाहरण में, includes ऑपरेटर के बारे में बताया गया है.

Data Connect में includesAll, excludes, excludesAll और अन्य पेमेंट के तरीके इस्तेमाल किए जा सकते हैं. रेफ़रंस दस्तावेज़ के _ListFilter हेडिंग में, पूर्णांकों, स्ट्रिंग, तारीखों, और अन्य डेटा टाइप के लिए, ऐसे सभी ऑपरेटर की समीक्षा करें.

क्वेरी

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

जवाब

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

स्ट्रिंग ऑपरेशन और रेगुलर एक्सप्रेशन के हिसाब से फ़िल्टर करना

आपकी क्वेरी में, स्ट्रिंग की खोज और तुलना करने वाली सामान्य कार्रवाइयों का इस्तेमाल किया जा सकता है. इनमें रेगुलर एक्सप्रेशन भी शामिल हैं. ध्यान दें कि यहां कई कार्रवाइयों को बंडल किया जा रहा है, ताकि उन्हें आसानी से किया जा सके. साथ ही, उन्हें एलियास के साथ अलग-अलग किया जा रहा है.

query MoviesTitleSearch($prefix: String, $suffix: String, $contained: String, $regex: String) {
  prefixed: movies(where: {title: {startsWith: $prefix}}) {...}
  suffixed: movies(where: {title: {endsWith: $suffix}}) {...}
  contained: movies(where: {title: {contains: $contained}}) {...}
}

_or, _and, _not ऑपरेटर लॉजिक का इस्तेमाल करके फ़िल्टर करना

ज़्यादा जटिल लॉजिक के लिए, _or का इस्तेमाल करें. Data Connect ऑपरेटर के साथ _and और _not ऑपरेटर भी इस्तेमाल किए जा सकते हैं.

क्वेरी

query ListMoviesByGenreAndGenre($minRating: Int!, $genre: String) {
  movies(
    where: { _or: [{ rating: { ge: $minRating } }, { genre: { eq: $genre } }] }
  ) {
    # graphql: list the fields from the results to return
    title
  }
}
    

जवाब

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

रिलेशनल क्वेरी लिखना

Data Connect क्वेरी, टेबल के बीच मौजूद संबंधों के आधार पर डेटा ऐक्सेस कर सकती हैं. अपने स्कीमा में तय किए गए ऑब्जेक्ट (वन-टू-वन) या ऐरे (वन-टू-मेनी) रिलेशनशिप का इस्तेमाल करके, नेस्ट की गई क्वेरी बनाई जा सकती हैं. इसका मतलब है कि किसी एक टाइप का डेटा, नेस्ट किए गए या उससे जुड़े टाइप के डेटा के साथ फ़ेच किया जा सकता है.

इस तरह की क्वेरी में, जनरेट किए गए रीड फ़ील्ड में मैजिक Data Connect _on_ और _via सिंटैक्स का इस्तेमाल किया जाता है.

सैंपल स्कीमा की समीक्षा करना न भूलें.

मेनी-टू-वन

अब _on_ सिंटैक्स को समझने के लिए, एक क्वेरी देखें.

क्वेरी

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

जवाब

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

वन टू वन

_on_ सिंटैक्स का इस्तेमाल करके, एक-से-एक क्वेरी लिखी जा सकती है.

क्वेरी

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

जवाब

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

मेनी-टू-मेनी

कई-से-कई क्वेरी में _via_ सिंटैक्स का इस्तेमाल किया जाता है. कई-से-कई क्वेरी, किसी फ़िल्म के लिए कलाकारों की जानकारी वापस ला सकती है.

क्वेरी

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

जवाब

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

हालांकि, हम एलियास का इस्तेमाल करके ज़्यादा जटिल क्वेरी लिख सकते हैं. इससे 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 for all fields

सबसे आसान एग्रीगेट फ़ील्ड _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

उदाहरण के लिए, अगर आपके पास ये प्रॉडक्ट हैं:

  • प्रॉडक्ट 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 और 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 } }
  ]
}

क्वेरी के लिए गिनती वाले फ़ील्ड

अपने स्कीमा में मौजूद एन्यूमरेशन फ़ील्ड के बारे में क्वेरी की जा सकती है.

मान लें कि हमारी गिनती इस तरह लागू की गई है:

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

गिनती वाले फ़ील्ड को फ़िल्टर करना

इनम के लिए, फ़िल्टर करने की ये स्टैंडर्ड कार्रवाइयां उपलब्ध हैं: eq, ne, ge, gt, lt, le, in nin. साथ ही, सूचियों के लिए includes, excludes, includesAll, और excludesAll कार्रवाइयां उपलब्ध हैं.

order में, ग्रेटर और लेस दैन ऑपरेटर, एनम वैल्यू के क्रम का इस्तेमाल करते हैं, ताकि उन्हें सही तरीके से लागू किया जा सके. एनम की शुरुआत में मौजूद वैल्यू, एनम की परिभाषा के आखिर में मौजूद वैल्यू से छोटी होती हैं.

उदाहरण के लिए, यहां दिया गया where क्लॉज़, इनपुट आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) से कम ratio वाली सभी फ़िल्में दिखाएगा.

  • पहले उदाहरण में, अगर $aspectRatio IMAX होता, तो ACADEMY, WIDESCREEN, और ANAMORPHIC से मेल खाने वाली फ़िल्में चुनी जातीं.ratio
  • दूसरे उदाहरण में, सिर्फ़ वे फ़िल्में दिखाई जाएंगी जो ACADEMY और WIDESCREEN, दोनों में उपलब्ध हैं.
  movies(where: {originalAspectRatio: {lt: $aspectRatio}})

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

गिनती वाले फ़ील्ड पर एग्रीगेशन क्वेरी चलाना

इनम के लिए, सिर्फ़ _count का इस्तेमाल किया जा सकता है.

नीचे दी गई क्वेरी में, हर आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) वाली फ़िल्मों की कुल संख्या का हिसाब लगाया गया है.

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

क्लाइंट कोड से कॉल की गिनती करने वाली क्वेरी

क्लाइंट से गिनती करने के लिए क्वेरी इस्तेमाल करने का तरीका जानें. साथ ही, गिनती को मैनेज करने के लिए, क्लाइंट कॉल को इस तरह से डिज़ाइन करने का तरीका जानें कि आपको ज़्यादा से ज़्यादा फ़ायदा मिल सके. इसके लिए, iOS, Android, वेब, और Flutter के लिए एसडीके टूल की गाइड देखें.

ऐडवांस क्वेरी लिखना: एक से ज़्यादा चरणों वाली कार्रवाइयों में डेटा पढ़ने के लिए, query फ़ील्ड का इस्तेमाल करना

कई बार ऐसा होता है, जब आपको म्यूटेशन के दौरान अपने डेटाबेस को पढ़ना पड़ सकता है. ऐसा इसलिए, ताकि मौजूदा डेटा को खोजा और उसकी पुष्टि की जा सके. उदाहरण के लिए, डेटा डालने या अपडेट करने से पहले ऐसा किया जाता है. इन विकल्पों से, राउंड ट्रिप के ऑपरेशन और लागत कम हो जाती है.

Data Connect में यह सुविधा काम करती है. एक से ज़्यादा चरणों वाली कार्रवाइयां देखें.

अगले चरण

आपकी इनमें दिलचस्पी हो सकती है: