Firebase Data Connect की मदद से, Google Cloud SQL से मैनेज किए जा रहे PostgreSQL इंस्टेंस के लिए कनेक्टर बनाए जा सकते हैं. ये कनेक्टर, आपके स्कीमा से डेटा का इस्तेमाल करने के लिए, क्वेरी और म्यूटेशन के कॉम्बिनेशन होते हैं.
शुरू करने के लिए गाइड में, PostgreSQL के लिए, फ़िल्म की समीक्षा करने वाले ऐप्लिकेशन का स्कीमा जोड़ा गया है.
उस गाइड में, डिप्लॉय किए जा सकने वाले और ad hoc एडमिनिस्ट्रेशन ऑपरेशन, दोनों के बारे में बताया गया है. इनमें क्वेरी भी शामिल हैं.
- डिप्लॉय की जा सकने वाली क्वेरी, वे क्वेरी होती हैं जिन्हें आपने क्लाइंट ऐप्लिकेशन से कॉल करने के लिए लागू किया है. ये क्वेरी, आपके तय किए गए एपीआई एंडपॉइंट के साथ काम करती हैं. इन्हें सर्वर पर डिप्लॉय किए गए कनेक्टर में बंडल किया जाता है. Data Connect टूल, आपके एपीआई के आधार पर क्लाइंट SDK जनरेट करता है. डिप्लॉय की गई क्वेरी, आईएएम नीति के तहत सुरक्षित नहीं होती हैं. इसलिए, 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
फ़ील्ड की मदद से क्वेरी करना
|
इस फ़ील्ड का इस्तेमाल करके, किसी एक फ़िल्म की कुंजी से क्वेरी करें. query GetMovie($myKey: Movie_Key!) { movie(key: $myKey) { title } } |
movies
फ़ील्ड की मदद से क्वेरी करना
|
एक से ज़्यादा फ़िल्मों के बारे में क्वेरी करने के लिए, इस फ़ील्ड का इस्तेमाल करें. उदाहरण के लिए, किसी साल की सभी फ़िल्में. query GetMovies($myYear: Int!) { movies(where: { year: { eq: $myYear } }) { title } } |
actors_on_movies
फ़ील्ड की मदद से क्वेरी करना
|
किसी फ़िल्म से जुड़े सभी कलाकारों के बारे में जानकारी पाने के लिए, इस फ़ील्ड का इस्तेमाल करें. query GetActorsOnMovie($myKey: Movie_Key!) { actors_on_movies(where: { movie: { key: { eq: $myKey } } }) { actor { name } } } |
क्वेरी के ज़रूरी एलिमेंट
Data Connect क्वेरी, Data Connect एक्सटेंशन वाली GraphQL क्वेरी होती हैं. सामान्य GraphQL क्वेरी की तरह ही, आपके पास ऑपरेशन का नाम और GraphQL वैरिएबल की सूची तय करने का विकल्प होता है.
Data Connect, @auth
जैसे पसंद के मुताबिक बनाए गए डायरेक्टिव की मदद से, GraphQL क्वेरी को बेहतर बनाता है.
इसलिए, इस क्वेरी में:
query
टाइप की परिभाषाListMoviesByGenre
ऑपरेशन (क्वेरी) का नाम- एक क्वेरी आर्ग्युमेंट, यहां
String
टाइप का$genre
वैरिएबल - एक डायरेक्टिव,
@auth
. - एक फ़ील्ड,
movies
.
query ListMoviesByGenre($genre: String!) @auth(level: PUBLIC) {
movies(where: { genre: { eq: $genre } }) {
id
title
}
}
हर क्वेरी आर्ग्युमेंट के लिए, टाइप का एलान करना ज़रूरी है. यह String
जैसा कोई बिल्ट-इन टाइप हो सकता है या Movie
जैसा स्कीमा से तय किया गया कस्टम टाइप हो सकता है.
इस गाइड में, ज़्यादा से ज़्यादा जटिल क्वेरी के सिग्नेचर पर ध्यान दिया जाएगा. आखिर में, आपको रिलेशनशिप एक्सप्रेशन के बारे में जानकारी मिलेगी. इनका इस्तेमाल, डिप्लॉय की जा सकने वाली क्वेरी बनाने के लिए किया जा सकता है.
क्वेरी में मुख्य स्केलर
हालांकि, सबसे पहले मुख्य स्केलर के बारे में जानकारी दें.
Data Connect, हर टेबल की मुख्य कुंजियों को दिखाने के लिए एक खास की स्केलर तय करता है. इन कुंजियों की पहचान {TableType}_Key से की जाती है. यह प्राइमरी की वैल्यू का JSON ऑब्जेक्ट है.
अपने-आप जनरेट होने वाले ज़्यादातर रीड फ़ील्ड से मिले जवाब के तौर पर, मुख्य स्केलर को वापस पाया जाता है. इसके अलावा, स्केलर कुंजी बनाने के लिए ज़रूरी सभी फ़ील्ड को वापस पाने वाली क्वेरी से भी मुख्य स्केलर को वापस पाया जा सकता है.
हमारे मौजूदा उदाहरण में movie
जैसी सिंगल ऑटोमैटिक क्वेरी, एक मुख्य आर्ग्युमेंट के साथ काम करती हैं. यह आर्ग्युमेंट, मुख्य स्केलर को स्वीकार करता है.
किसी मुख्य स्केलर को लिटरल के तौर पर पास किया जा सकता है. हालांकि, इनपुट के तौर पर मुख्य स्केलर पास करने के लिए, वैरिएबल तय किए जा सकते हैं.
क्वेरी
query GetMovie($myKey: Movie_Key!) { movie(key: $myKey) { title } }
जवाब
{ "data": { "movie": { "title": "Example Movie Title" } } }
इन्हें अनुरोध के JSON फ़ॉर्मैट में इस तरह या सीरियलाइज़ेशन के अन्य फ़ॉर्मैट में दिया जा सकता है:
{
# …
"variables": {
"myKey": {"id": "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"}
}
}
कस्टम स्केलर पार्सिंग की मदद से, ऑब्जेक्ट सिंटैक्स का इस्तेमाल करके भी Movie_Key
बनाया जा सकता है. इसमें वैरिएबल शामिल हो सकते हैं. यह सुविधा तब ज़्यादा काम की होती है, जब आपको किसी वजह से अलग-अलग कॉम्पोनेंट को अलग-अलग वैरिएबल में बांटना हो.
बुनियादी क्वेरी लिखना
अपने डेटाबेस से अलग-अलग रिकॉर्ड पाने के लिए, क्वेरी लिखी जा सकती हैं. इसके अलावा, नतीजों को सीमित करने और क्रम से लगाने के विकल्प के साथ, टेबल से रिकॉर्ड की सूची बनाई जा सकती है.
अलग-अलग रिकॉर्ड वापस पाना
सबसे आसान क्वेरी से, आईडी के हिसाब से एक रिकॉर्ड मिलता है. आपकी क्वेरी में, अपने-आप जनरेट हुए movie
फ़ील्ड का इस्तेमाल किया जाएगा.
क्वेरी
query GetMovieById($id: UUID!) @auth(level: PUBLIC) { movie(id: $id) { id title imageUrl genre } }
जवाब
{ "data": { "movie": { "id": "some-uuid", "title": "Example Movie Title", "imageUrl": "https://example.com/movie.jpg", "genre": "Action" } } }
टेबल में मौजूद सभी रिकॉर्ड वापस पाना
Movies
टेबल से, फ़िल्मों की पूरी सूची के लिए फ़ील्ड का सबसेट पाने के लिए, आपकी क्वेरी में अपने-आप जनरेट हुए movies
फ़ील्ड का इस्तेमाल किया जाएगा. साथ ही, लागू करने का तरीका कुछ ऐसा दिख सकता है.
क्वेरी
query ListMovies @auth(level: PUBLIC) { movies { id title imageUrl genre } }
जवाब
{ "data": { "movies": [ { "id": "some-uuid", "title": "Example Movie Title", "imageUrl": "https://example.com/movie.jpg", "genre": "Action" }, { "id": "another-uuid", "title": "Another Movie Title", "imageUrl": "https://example.com/another-movie.jpg", "genre": "Comedy" } ] } }
orderBy
, limit
, और offset
ऑपरेटर का इस्तेमाल करना
किसी टेबल के सभी रिकॉर्ड की सूची बनाने का फ़ायदा सीमित होता है.
नतीजों को क्रम से लगाया जा सकता है और पेजेशन किया जा सकता है. इन आर्ग्युमेंट को स्वीकार किया जाता है, लेकिन नतीजों में नहीं दिखाया जाता.
यहां, क्वेरी में रेटिंग के हिसाब से टॉप 10 फ़िल्मों के टाइटल मिलते हैं.
क्वेरी
query MoviesTop10 { movies(orderBy: [{ rating: DESC }], limit: 10) { # graphql: list the fields from the results to return title } }
जवाब
{ "data": { "movies": [ { "title": "Top Movie 1" }, { "title": "Top Movie 2" }, { "title": "Top Movie 3" } // ... other 7 movies ] } }
हो सकता है कि आपके पास किसी ऑफ़सेट से पंक्तियां फ़ेच करने का कोई इस्तेमाल का उदाहरण हो, जैसे कि रेटिंग के हिसाब से 11 से 20 वाली फ़िल्में.
क्वेरी
query Movies11to20 { movies(orderBy: [{ rating: DESC }], limit: 10, offset: 10) { # graphql: list the fields from the results to return title } }
जवाब
{ "data": { "movies": [ { "title": "Movie 11" }, { "title": "Movie 12" }, { "title": "Movie 13" } // ... other 7 movies ] } }
क्वेरी में अन्य नामों का इस्तेमाल करना
Data Connect क्वेरी में 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
सबसे आसान एग्रीगेट फ़ील्ड _count
है: यह दिखाता है कि आपकी क्वेरी से कितनी पंक्तियां मैच करती हैं. आपके टाइप के हर फ़ील्ड के लिए, Data Connect
फ़ील्ड टाइप के आधार पर उससे जुड़े एग्रीगेट फ़ील्ड जनरेट करता है.
क्वेरी
query CountProducts {
products {
_count
}
}
जवाब one
one
उदाहरण के लिए, अगर आपके डेटाबेस में पांच प्रॉडक्ट हैं, तो नतीजा यह होगा:
{
"products": [
{
"_count": 5
}
]
}
सभी फ़ील्ड में एक <field>_count
फ़ील्ड होता है. इससे यह पता चलता है कि कितनी पंक्तियों में उस फ़ील्ड में कोई वैल्यू मौजूद है.
क्वेरी
query CountProductsWithExpirationDate {
products {
expirationDate_count
}
}
जवाबfield_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
_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
_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
distinct
उदाहरण के लिए, अगर आपके पास ये मैन्युफ़ैक्चरर हैं:
- प्रॉडक्ट A:
manufacturer: "Acme"
- प्रॉडक्ट B:
manufacturer: "Beta"
- प्रॉडक्ट C:
manufacturer: "Acme"
इसका नतीजा यह होगा:
{
"products": [
{ "manufacturer": "Acme" },
{ "manufacturer": "Beta" }
]
}
अलग-अलग वैल्यू को एग्रीगेट करने के लिए, एग्रीगेट फ़ील्ड पर distinct
आर्ग्युमेंट का इस्तेमाल भी किया जा सकता है. उदाहरण के लिए:
क्वेरी
query CountDistinctManufacturers {
products {
manufacturer_count(distinct: true)
}
}
जवाबdistinctonaggregate
distinctonaggregate
उदाहरण के लिए, अगर आपके पास ये मैन्युफ़ैक्चरर हैं:
- प्रॉडक्ट A:
manufacturer: "Acme"
- प्रॉडक्ट B:
manufacturer: "Beta"
- प्रॉडक्ट C:
manufacturer: "Acme"
इसका नतीजा यह होगा:
{
"products": [
{
"manufacturer_count": 2
}
]
}
ग्रुप किए गए एग्रीगेटर
किसी टाइप पर एग्रीगेट और नॉन-एग्रीगेट फ़ील्ड का मिक्स चुनकर, ग्रुप किया गया एग्रीगेट किया जाता है. यह उन सभी मैच होने वाली पंक्तियों को एक साथ ग्रुप करता है जिनमें एग्रीगेट नहीं किए गए फ़ील्ड के लिए एक ही वैल्यू होती है. साथ ही, उस ग्रुप के लिए एग्रीगेट किए गए फ़ील्ड का हिसाब लगाता है. उदाहरण के लिए:
क्वेरी
query MostExpensiveProductByManufacturer {
products {
manufacturer
price_max
}
}
जवाबgroupedaggregates
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
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
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 इस सुविधा के साथ काम करता है. एक से ज़्यादा चरणों वाले ऑपरेशन देखें.
अगले चरण
आपकी दिलचस्पी इनमें हो सकती है:
- एआई की मदद करने वाले टूल का इस्तेमाल करके, अपने ऐप्लिकेशन के लिए क्वेरी जनरेट करना
- अनुमति से जुड़ी गाइड के मुताबिक, अपनी क्वेरी को अनुमति देना
- वेब, iOS, Android और Flutter के लिए, अपने क्लाइंट कोड से क्वेरी कॉल करना.