تتيح لك Firebase Data Connect إنشاء موصّلات لمثيلات PostgreSQL التي تتم إدارتها باستخدام Google Cloud SQL. هذه الوصلات هي مجموعات من طلبات البحث وعمليات التعديل لاستخدام بياناتك من المخطط.
قدّم دليل البدء مخططًا لتطبيق مراجعات الأفلام خاصًا بـ PostgreSQL.
قدّم هذا الدليل أيضًا العمليات الإدارية القابلة للنشر والمخصّصة، بما في ذلك طلبات البحث.
- الطلبات القابلة للنشر هي الطلبات التي تنفّذها لإجراء مكالمات من تطبيقات العميل، مع نقاط نهاية لواجهة برمجة التطبيقات تحدّدها أنت. يمكنك تجميعها في موصل
يتم نشره على الخادم. تنشئ أدوات 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 هي طلبات بحث GraphQL تتضمّن إضافات Data Connect. كما هو الحال مع طلب بحث GraphQL العادي، يمكنك تحديد اسم عملية وقائمة بمتغيرات GraphQL.
توسّع Data Connect طلبات بحث GraphQL باستخدام توجيهات مخصّصة، مثل
@auth
.
لذا، يتضمّن الاستعلام التالي:
- تعريف نوع
query
- اسم
ListMoviesByGenre
عملية (طلب بحث) - وسيطة استعلام واحدة، وهي هنا متغيّر
$genre
من النوعString
- توجيه واحد،
@auth
- حقل واحد، وهو
movies
query ListMoviesByGenre($genre: String!) @auth(level: PUBLIC) {
movies(where: { genre: { eq: $genre } }) {
id
title
}
}
تتطلّب كل وسيطة طلب بحث تعريف نوع، أو نوعًا مضمّنًا مثل String
، أو نوعًا مخصّصًا محدّدًا في المخطط مثل Movie
.
سيتناول هذا الدليل توقيعات طلبات البحث المتزايدة التعقيد. سنختتم هذه السلسلة بتقديم تعابير علاقات قوية وموجزة يمكنك استخدامها لإنشاء طلبات البحث القابلة للنشر.
القيم العددية الرئيسية في طلبات البحث
لكن أولاً، ملاحظة حول القيم العددية الرئيسية.
تحدّد Data Connect نوعًا خاصًا من البيانات العددية للمفاتيح لتمثيل المفاتيح الأساسية لكل جدول، ويتم تحديدها من خلال {TableType}_Key. وهو عنصر JSON يتضمّن قيم المفاتيح الأساسية.
يمكنك استرداد القيم العددية الرئيسية كاستجابة تعرضها معظم الحقول التي يتم إنشاؤها تلقائيًا للقراءة، أو بالطبع من طلبات البحث التي استرددت فيها جميع الحقول اللازمة لإنشاء المفتاح العددي.
تتيح طلبات البحث التلقائية الفردية، مثل movie
في المثال الحالي، وسيطة مفتاح تقبل عددًا قياسيًا للمفتاح.
يمكنك تمرير قيمة عددية أساسية كمقدار حرفي. ومع ذلك، يمكنك تحديد متغيرات لتمرير قيم عددية أساسية كمُدخل.
طلب البحث
query GetMovie($myKey: Movie_Key!) { movie(key: $myKey) { title } }
الردّ
{ "data": { "movie": { "title": "Example Movie Title" } } }
يمكن تقديم هذه البيانات بتنسيق JSON للطلب على النحو التالي (أو بتنسيقات تسلسلية أخرى):
{
# …
"variables": {
"myKey": {"id": "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"}
}
}
بفضل تحليل القيم العددية المخصّصة، يمكن أيضًا إنشاء Movie_Key
باستخدام بنية الكائن، والتي قد تحتوي على متغيّرات. ويكون ذلك مفيدًا في الغالب عندما تريد تقسيم المكوّنات الفردية إلى متغيرات مختلفة لسبب ما.
كتابة طلبات بحث أساسية
يمكنك البدء بكتابة طلبات بحث للحصول على سجلّات فردية من قاعدة البيانات، أو إدراج سجلّات من جدول مع خيار الحدّ من النتائج وترتيبها.
استرداد سجلّات فردية
يحصل أبسط طلب بحث على سجلّ واحد حسب رقم التعريف. سيستخدم طلب البحث الحقل movie
الذي يتم إنشاؤه تلقائيًا.
طلب البحث
query GetMovieById($id: UUID!) @auth(level: PUBLIC) { movie(id: $id) { id title imageUrl genre } }
الردّ
{ "data": { "movie": { "id": "some-uuid", "title": "Example Movie Title", "imageUrl": "https://example.com/movie.jpg", "genre": "Action" } } }
استرداد جميع السجلات في جدول
لاسترداد مجموعة فرعية من الحقول للقائمة الكاملة للأفلام من الجدول Movies
، سيستخدم طلب البحث الحقل movies
الذي يتم إنشاؤه تلقائيًا، وقد يبدو التنفيذ على النحو التالي.
طلب البحث
query ListMovies @auth(level: PUBLIC) { movies { id title imageUrl genre } }
الردّ
{ "data": { "movies": [ { "id": "some-uuid", "title": "Example Movie Title", "imageUrl": "https://example.com/movie.jpg", "genre": "Action" }, { "id": "another-uuid", "title": "Another Movie Title", "imageUrl": "https://example.com/another-movie.jpg", "genre": "Comedy" } ] } }
استخدام عوامل التشغيل orderBy
وlimit
وoffset
من الطبيعي أن يكون عرض جميع السجلات من جدول ما محدود الفائدة.
يمكنك ترتيب النتائج وتقسيمها إلى صفحات. يتم قبول هذه الوسيطات، ولكن لا يتم عرضها في النتائج.
في هذا المثال، يحصل طلب البحث على عناوين أفضل 10 أفلام حسب التقييم.
طلب البحث
query MoviesTop10 { movies(orderBy: [{ rating: DESC }], limit: 10) { # graphql: list the fields from the results to return title } }
الردّ
{ "data": { "movies": [ { "title": "Top Movie 1" }, { "title": "Top Movie 2" }, { "title": "Top Movie 3" } // ... other 7 movies ] } }
قد تحتاج إلى استرداد صفوف من موضع إزاحة، مثل الأفلام من 11 إلى 20 مرتبة حسب التقييم.
طلب البحث
query Movies11to20 { movies(orderBy: [{ rating: DESC }], limit: 10, offset: 10) { # graphql: list the fields from the results to return title } }
الردّ
{ "data": { "movies": [ { "title": "Movie 11" }, { "title": "Movie 12" }, { "title": "Movie 13" } // ... other 7 movies ] } }
استخدام الأسماء المستعارة في طلبات البحث
تتيح Data Connect استخدام الأسماء المستعارة في GraphQL في طلبات البحث. باستخدام الأسماء المستعارة، يمكنك إعادة تسمية البيانات التي يتم عرضها في نتائج طلب البحث. يمكن أن يطبّق طلب بحث واحد Data Connect فلاتر متعددة أو عمليات طلب بحث أخرى في طلب واحد فعّال إلى الخادم، ما يؤدي إلى إصدار عدة "طلبات بحث فرعية" في وقت واحد. لتجنُّب تعارض الأسماء في مجموعة البيانات التي يتم عرضها، يمكنك استخدام أسماء مستعارة للتمييز بين الاستعلامات الفرعية.
في ما يلي طلب بحث يستخدم فيه تعبير الأسماء المستعارة mostPopular
وleastPopular
.
طلب البحث
query ReviewPopularitySpread($genre: String) { mostPopular: review( first: { where: {genre: {eq: $genre}}, orderBy: {popularity: DESC} } ), leastPopular: review( last: { where: {genre: {eq: $genre}}, orderBy: {popularity: DESC} } ) }
الردّ
{ "data": { "mostPopular": [ { "popularity": 9 } ], "leastPopular": [ { "popularity": 1 } ] } }
استخدام فلاتر طلب البحث
يتم ربط طلبات البحث Data Connect بجميع فلاتر SQL الشائعة وعمليات الترتيب.
الفلترة باستخدام 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" } ] } }
الفلترة حسب اختبار القيم الفارغة
يمكنك اختبار قيم null
باستخدام عامل التشغيل isNull
.
طلب البحث
query ListMoviesWithoutDescription { movies(where: { description: { isNull: true }}) { id title } }
الردّ
{ "data": { "movies": [ { "id": "some-uuid", "title": "Example Movie Title" }, { "id": "another-uuid", "title": "Another Movie Title" } ] } }
للاطّلاع على المزيد من عوامل التشغيل، راجِع دليل مرجع أنواع عناصر الإدخال.
الفلترة باستخدام مقارنات القيم
يمكنك استخدام عوامل مثل lt
(أصغر من) وge
(أكبر من أو يساوي)
لمقارنة القيم في طلبات البحث.
طلب البحث
query ListMoviesByRating($minRating: Int!, $maxRating: Int!) { movies(where: { rating: { ge: $minRating, lt: $maxRating }}) { id title } }
الردّ
{ "data": { "movies": [ { "id": "some-uuid", "title": "Example Movie Title" }, { "id": "another-uuid", "title": "Another Movie Title" } ] } }
الفلترة باستخدام عاملَي التشغيل includes
وexcludes
لحقول المصفوفة
يمكنك اختبار ما إذا كان حقل مصفوفة يتضمّن عنصرًا محدّدًا.
يوضّح المثال التالي عامل التشغيل includes
.
يتوافق Data Connect مع includesAll
وexcludes
وexcludesAll
وغيرها. راجِع جميع عوامل التشغيل هذه للأعداد الصحيحة والسلاسل والتواريخ وأنواع البيانات الأخرى في عناوين _ListFilter
ضمن مستندات المرجع.
طلب البحث
query ListMoviesByTag($tag: String!) { movies(where: { tags: { includes: $tag }}) { # graphql: list the fields from the results to return id title } }
الردّ
{ "data": { "movies": [ { "id": "some-uuid", "title": "Example Movie Title" } ] } }
الفلترة باستخدام عمليات السلسلة والتعبيرات العادية
يمكن أن تستخدم طلبات البحث عمليات البحث عن السلاسل ومقارنتها، بما في ذلك التعبيرات العادية. ملاحظة: لتحقيق الكفاءة، يمكنك تجميع عدة عمليات هنا وتوضيحها باستخدام الأسماء المستعارة.
query MoviesTitleSearch($prefix: String, $suffix: String, $contained: String, $regex: String) {
prefixed: movies(where: {title: {startsWith: $prefix}}) {...}
suffixed: movies(where: {title: {endsWith: $suffix}}) {...}
contained: movies(where: {title: {contains: $contained}}) {...}
}
الفلترة باستخدام منطق عامل التشغيل _or
أو _and
أو _not
استخدِم _or
لتطبيق منطق أكثر تعقيدًا. يتوافق Data Connect أيضًا مع عاملَي التشغيل _and
و_not
.
طلب البحث
query ListMoviesByGenreAndGenre($minRating: Int!, $genre: String) { movies( where: { _or: [{ rating: { ge: $minRating } }, { genre: { eq: $genre } }] } ) { # graphql: list the fields from the results to return title } }
الردّ
{ "data": { "movies": [ { "title": "Movie Title 1" }, { "title": "Movie Title 2" } ] } }
كتابة طلبات بحث مرتبطة
يمكن أن تصل طلبات البحث في Data Connect إلى البيانات استنادًا إلى العلاقات بين الجداول. يمكنك استخدام علاقات الكائن (واحد إلى واحد) أو المصفوفة (واحد إلى متعدد) المحددة في المخطط لإنشاء طلبات بحث متداخلة، أي جلب بيانات لنوع واحد مع بيانات من نوع متداخل أو ذي صلة.
تستخدم هذه الاستعلامات بناء الجملة السحري Data Connect _on_
و_via
في حقول القراءة التي يتم إنشاؤها.
يُرجى تذكُّر مراجعة نموذج المخطط.
متعدد إلى واحد
لنلقِ نظرة الآن على طلب بحث لتوضيح بنية _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
one
على سبيل المثال، إذا كان لديك 5 منتجات في قاعدة البيانات، ستكون النتيجة كما يلي:
{
"products": [
{
"_count": 5
}
]
}
تحتوي جميع الحقول على حقل <field>_count
، والذي يحسب عدد الصفوف التي تحتوي على قيمة غير فارغة في هذا الحقل.
طلب البحث
query CountProductsWithExpirationDate {
products {
expirationDate_count
}
}
الردّfield_count
field_count
على سبيل المثال، إذا كان لديك 3 منتجات لها تاريخ انتهاء صلاحية، ستكون النتيجة كما يلي:
{
"products": [
{
"expirationDate_count": 3
}
]
}
min وmax وsum وavg للحقول الرقمية
تحتوي الحقول الرقمية (int وfloat وint64) أيضًا على <field>_min
و<field>_max
و<field>_sum
و<field>_avg
.
طلب البحث
query NumericAggregates {
products {
quantityInStock_max
price_min
price_avg
quantityInStock_sum
}
}
الردّ_min _max _sum _avg
_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
_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
distinct
على سبيل المثال، إذا كان لديك المصنّعون التاليون:
- المنتج "أ":
manufacturer: "Acme"
- المنتج "ب":
manufacturer: "Beta"
- المنتج "ج":
manufacturer: "Acme"
ستكون النتيجة على النحو التالي:
{
"products": [
{ "manufacturer": "Acme" },
{ "manufacturer": "Beta" }
]
}
يمكنك أيضًا استخدام الوسيطة distinct
في الحقول المجمّعة لتجميع القيم المميّزة بدلاً من ذلك. على سبيل المثال:
طلب البحث
query CountDistinctManufacturers {
products {
manufacturer_count(distinct: true)
}
}
الردّdistinctonaggregate
distinctonaggregate
على سبيل المثال، إذا كان لديك المصنّعون التاليون:
- المنتج "أ":
manufacturer: "Acme"
- المنتج "ب":
manufacturer: "Beta"
- المنتج "ج":
manufacturer: "Acme"
ستكون النتيجة على النحو التالي:
{
"products": [
{
"manufacturer_count": 2
}
]
}
التجميعات المجمَّعة
يمكنك إجراء عملية تجميع مجمّعة من خلال اختيار مزيج من الحقول المجمّعة وغير المجمّعة في أحد الأنواع. يؤدي ذلك إلى تجميع كل الصفوف المتطابقة التي تتضمّن القيمة نفسها للحقول غير المجمّعة، واحتساب الحقول المجمّعة لهذه المجموعة. على سبيل المثال:
طلب البحث
query MostExpensiveProductByManufacturer {
products {
manufacturer
price_max
}
}
الردّgroupedaggregates
groupedaggregates
على سبيل المثال، إذا كانت لديك المنتجات التالية:
- المنتج (أ):
manufacturer: "Acme"
،price: 2.99
- المنتج (ب):
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
على سبيل المثال، إذا كانت لديك المنتجات التالية:
- المنتج (أ):
manufacturer: "Acme"
،price: 2.99
- المنتج (ب):
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
على سبيل المثال، إذا كان لديك المصنّعون التاليون:
- الشركة المصنّعة (أ):
name: "Acme"
،products_on_manufacturer: 2
- الشركة المصنّعة (ب):
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