الانتقال إلى المحتوى الرئيسي
يوفّر هذا الدليل أنماطًا شائعة للعمل مع بيانات JSON المنسوخة من MongoDB إلى ClickHouse عبر ClickPipes. لنفترض أننا أنشأنا مجموعة t1 في MongoDB لتتبّع طلبات العملاء:
يقوم MongoDB CDC Connector بنسخ مستندات MongoDB إلى ClickHouse باستخدام نوع بيانات JSON المدعوم أصلاً. وسيحتوي الجدول المُكرَّر t1 في ClickHouse على الصف التالي:

مخطط الجدول

تستخدم الجداول المُكرّرة المخطط القياسية التالية:
  • _id: المفتاح الأساسي من MongoDB
  • doc: وثيقة MongoDB مُكرَّرة بصيغة نوع بيانات JSON
  • _peerdb_synced_at: يسجّل وقت آخر مزامنة للصف
  • _peerdb_version: يتتبع إصدار الصف؛ ويزداد عند تحديث الصف أو حذفه
  • _peerdb_is_deleted: يبيّن ما إذا كان الصف محذوفًا

محرك الجدول ReplacingMergeTree

تربط ClickPipes مجموعات MongoDB في ClickHouse باستخدام عائلة محركات الجداول ReplacingMergeTree. ومع هذا المحرك، تُمثَّل التحديثات على أنها عمليات insert بإصدار أحدث (_peerdb_version) من المستند لمفتاح أساسي (_id) محدد، مما يتيح معالجة التحديثات وعمليات الاستبدال والحذف بكفاءة باعتبارها versioned inserts. يزيل ReplacingMergeTree التكرارات بشكل غير متزامن في الخلفية. ولضمان عدم وجود تكرارات للصف نفسه، استخدم المُعدِّل FINAL. على سبيل المثال:

التعامل مع عمليات الحذف

تُمرَّر عمليات الحذف من MongoDB كصفوف جديدة مُعلَّمة على أنها محذوفة باستخدام العمود _peerdb_is_deleted. وعادةً ما ستحتاج إلى استبعادها في استعلاماتك:
يمكنك أيضًا إنشاء سياسة على مستوى الصف لتصفية الصفوف المحذوفة تلقائيًا، بدلًا من تحديد شرط التصفية في كل استعلام:

الاستعلام عن بيانات JSON

يمكنك الاستعلام مباشرةً عن حقول JSON باستخدام صيغة النقطة:
Query
Result
عند الاستعلام عن حقول الكائنات المتداخلة باستخدام البنية النقطية، تأكد من إضافة العامل ^:
Query
Result

نوع Dynamic

في ClickHouse، يكون نوع كل حقل في JSON هو Dynamic. ويتيح النوع Dynamic لـ ClickHouse تخزين قيم من أي نوع من دون الحاجة إلى معرفة النوع مسبقًا. يمكنك التحقق من ذلك باستخدام الدالة toTypeName:
Query
Result
لفحص أنواع البيانات الأساسية لحقلٍ ما، يمكنك استخدام الدالة dynamicType. لاحظ أنه قد توجد أنواع بيانات مختلفة لاسم الحقل نفسه في صفوف مختلفة:
Query
Result
تعمل الدوال العادية مع النوع Dynamic تمامًا كما هو الحال مع الأعمدة العادية: مثال 1: تحليل Date
Query
Result
مثال 2: المنطق الشرطي
Query
Result
مثال 3: عمليات على Array
Query
Result

تحويل نوع الحقل

لا تعمل دوال التجميع في ClickHouse مباشرةً مع نوع Dynamic. على سبيل المثال، إذا حاولت استخدام الدالة sum مباشرةً على نوع Dynamic، فستحصل على الخطأ التالي:
لاستخدام دوال التجميع، حوِّل الحقل إلى النوع المناسب باستخدام الدالة CAST أو صيغة :::
Query
Result
يُعد التحويل من نوع Dynamic إلى نوع البيانات الأساسي (الذي يحدده dynamicType) عالي الكفاءة جدًا، لأن ClickHouse يخزّن القيمة داخليًا مسبقًا بنوعها الأساسي.

تسوية JSON

العرض العادي

يمكنك إنشاء عروض عادية فوق جدول JSON لاحتواء منطق التسطيح/تحويل النوع/التحويل، بحيث تتمكن من الاستعلام عن البيانات بطريقة مشابهة لجدول علائقي. وتُعد العروض العادية خفيفة، لأنها لا تخزن سوى الاستعلام نفسه، وليس البيانات الأساسية. على سبيل المثال:
سيكون لطريقة العرض هذه المخطط التالي:
يمكنك الآن إجراء استعلام على طريقة العرض كما لو كنت تستعلم جدولًا مُسطَّحًا:

العرض المادي القابل للتحديث

يمكنك إنشاء العروض المادية القابلة للتحديث، ما يتيح لك جدولة تنفيذ الاستعلام لإزالة تكرار الصفوف وتخزين النتائج في جدول هدف مُسطَّح. ومع كل تحديث مجدول، يُستبدل الجدول الهدف بأحدث نتائج الاستعلام. تكمن الميزة الأساسية لهذه الطريقة في أن الاستعلام الذي يستخدم الكلمة المفتاحية FINAL يُشغَّل مرة واحدة فقط أثناء التحديث، مما يلغي حاجة الاستعلامات اللاحقة على الجدول الهدف إلى استخدام FINAL. ومن عيوب هذه الطريقة أن البيانات في الجدول الهدف لا تكون مُحدَّثة إلا بقدر حداثة آخر تحديث. وفي كثير من حالات الاستخدام، توفّر فترات التحديث التي تتراوح من عدة دقائق إلى بضع ساعات توازنًا جيدًا بين حداثة البيانات وأداء الاستعلام.
يمكنك الآن الاستعلام عن الجدول flattened_t1 مباشرةً من دون المُعدِّل FINAL:

العرض المادي التزايدي

إذا كنت تريد الوصول إلى الأعمدة المُسطَّحة في الوقت الفعلي، فيمكنك إنشاء عروض مادية تزايدية. وإذا كان جدولك يشهد تحديثات متكررة، فلا يُنصح باستخدام المُعدِّل FINAL في العرض المادي، لأن كل تحديث سيؤدي إلى عملية دمج. وبدلًا من ذلك، يمكنك إزالة التكرار من البيانات وقت الاستعلام عن طريق إنشاء عرض عادي فوق العرض المادي.
يمكنك الآن الاستعلام عن العرض flattened_t1_final كما يلي:
آخر تعديل في ٢ يوليو ٢٠٢٦