9 أنواع من مشغلي Mongodb تحتاج إلى معرفتها

نشرت: 2022-09-09

في أي عمل ، البيانات هي أكبر أصولك. من خلال تحليل البيانات ، يمكنك اتخاذ قرارات بشأن اتجاهات العملاء والتنبؤ بالسلوك. هذا يعزز ربحية الأعمال واتخاذ القرار الفعال.

بدون برنامج قواعد البيانات ، ستكون مهمة بسيطة مثل العثور على متوسط ​​جميع القيم في نظام مليء بالسجلات مملة. لحسن الحظ ، جعلت قواعد البيانات تحليل البيانات أسهل وأسرع مع الوظائف والمشغلين.

ستلقي هذه المقالة بعض الضوء على العوامل المستخدمة في برنامج قاعدة بيانات MongoDB.

ما المقصود بمشغلي MongoDB؟

MongoDB هو برنامج قاعدة بيانات NoSQL يدير المعلومات الموجهة للمستندات.

واحدة من السمات الرئيسية لـ MongoDB هي سرعتها. لإرجاع الاستعلامات بشكل أسرع ، قد يستخدم MongoDB عوامل التشغيل لأداء وظائف محددة.

العوامل هي رموز خاصة تساعد المترجمين على أداء المهام الرياضية أو المنطقية. تقدم MongoDB عدة أنواع من المشغلين للتفاعل مع قاعدة البيانات.

أنواع مشغل MongoDB

هناك تسعة أنواع من المشغلات ، كل منها يسمى بوظيفته. على سبيل المثال ، تستخدم العوامل المنطقية العمليات المنطقية. لتنفيذها ، تحتاج إلى استخدام كلمة رئيسية محددة واتباع بناء الجملة. ومع ذلك ، فهي سهلة المتابعة إلى حد ما!

بنهاية المقالة ، ستكون قادرًا على تعلم أساسيات كل مشغل ووظائفه.

العوامل المنطقية

غالبًا ما تُستخدم العوامل المنطقية لتصفية البيانات بناءً على الشروط المحددة. كما أنها تسمح بتقييم العديد من الشروط ، والتي سنناقشها بمزيد من التفصيل.

فيما يلي بعض العوامل المنطقية التي يمكنك استخدامها:

$ و

ينفذ الشرط "and" عملية منطقية "و" على مصفوفة من تعبيرين أو أكثر. يحدد المستندات التي يتم فيها استيفاء جميع شروط التعبيرات.

هذا هو بناء الجملة القياسي لـ $and والتعبير:

 { $and: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] } على سبيل المثال ، إذا أردنا تحديد المستندات التي يكون السعر فيها 10 دولارات والكمية أقل من 15 ، يمكننا إدخال الاستعلام التالي:
 db.inventory.find( { $and: [ { quantity: { $lt: 15 } }, { price: 10 } ] } )

دولار أو

ينفذ الشرط "or" عملية منطقية "أو" على مصفوفة من تعبيرين أو أكثر. يحدد المستندات التي يكون فيها تعبير واحد على الأقل صحيحًا.

هذا هو بناء الجملة القياسي لـ $or التعبير:

 { $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }.

على سبيل المثال ، إذا أردنا تحديد المستندات التي يكون السعر فيها 10 دولارات أو تكون الكمية أقل من 15 ، فيمكننا إدخال الاستعلام التالي:

 db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 } ] } )

لا يتعين علينا قصر التعبير على معيارين - يمكننا إضافة المزيد. على سبيل المثال ، يحدد الاستعلام أدناه تلك المستندات التي يكون فيها السعر مساويًا لـ 10 دولارات ، أو تكون الكمية أقل من 15 عامًا ، أو تكون العلامة ثابتة:

 db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 }, { tag: stationary }] } )

عند تشغيل هذه الجمل ، يقوم MongoDB إما بإجراء مسح للمجموعة أو مسح فهرس. إذا كانت جميع الفهارس تدعم الجمل ، فإن MongoDB يستخدم الفهارس للتحقق من $or التعبير. خلاف ذلك ، فإنه يستخدم مسح المجموعة بدلا من ذلك.

ولكن إذا كنت ترغب في اختبار المعايير في نفس الحقل ، فقد ترغب في استخدام عامل التشغيل $in بدلاً من $or عامل التشغيل. على سبيل المثال ، إذا كنت تريد مجموعة من المستندات حيث تكون الكمية إما 10 أو 20 ، فقد تضطر إلى تشغيل $in الاستعلام بدلاً من ذلك:

 db.inventory.find ( { quantity: { $in: [20, 50] } } )

سنغطي المزيد على العامل $in لاحقًا.

$ ولا

ينفذ هذا العامل عملية منطقية "ولا" على مصفوفة باستخدام تعبير واحد أو أكثر. بعد ذلك ، يحدد المستندات التي تفشل في تعبيرات الاستعلام. بعبارات أبسط ، فإنه يفعل عكس $or الشرط.

هذه هي الصيغة العامة:

 { $nor: [ { <expression1> }, { <expression2> }, ... { <expressionN> } ] }

دعنا نفكر في الاستعلام التالي:

 db.inventory.find( { $nor: [ { price: 3.99 }, { sale: true } ] } )

يحدد هذا الاستعلام المستندات التي تحتوي على:

  • قيمة حقل السعر لا تساوي 3.99 دولارًا ، وقيمة البيع لا تساوي صواب ؛ أو
  • قيمة حقل سعر لا تساوي 3.99 دولارات أمريكية ، وحقل بيع فارغ أو غائب ؛ أو
  • لا يوجد حقل سعر ، وحقل بيع لا يساوي true ؛ أو
  • لا حقل السعر ولا حقل البيع مأهول أو موجود.

$ لا

ينفذ هذا العامل عملية منطقية "not" على مصفوفة للتعبير المحدد. ثم يقوم بتحديد المستندات التي لا تتطابق مع تعبيرات الاستعلام. يتضمن هذا المستندات التي لا تحتوي على الحقل.

هذه هي الصيغة العامة:

 { field: { $not: { <operator-expression> } } }

على سبيل المثال ، خذ الاستعلام التالي:

 db.inventory.find( { price: { $not: { $lt: 3.99 } } } )

سيحدد هذا الاستعلام تلك المستندات التي تحتوي على:

  • حقل سعر قيمته أكبر من أو تساوي 3.99 دولارات أمريكية ؛ و
  • حقل السعر غير مأهول أو غير موجود.

عوامل المقارنة

يمكن استخدام عوامل المقارنة لمقارنة القيم في مستند واحد أو أكثر.

يوجد أدناه نموذج لرمز مجموعة مخزون بسيط لمتجر سوبر ماركت:

 { _id: 1, item: { name: "apple", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }, { _id: 2, item: { name: "banana", code: "123" }, qty: 20, tags: [ "B" ] }, { _id: 3, item: { name: "spinach", code: "456" }, qty: 25, tags: [ "A", "B" ] }, { _id: 4, item: { name: "lentils", code: "456" }, qty: 30, tags: [ "B", "A" ] }, { _id: 5, item: { name: "pears", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }, { _id: 6, item: { name: "strawberry", code: "123" }, tags: [ "B" ] }

سنستخدم هذا المثال أثناء تفصيل كل عامل مقارنة بعد ذلك.

يساوي ($ eq)

هذا العامل يطابق القيم التي تساوي القيمة المحددة:

 { <field>: { $eq: <value> } }

على سبيل المثال ، إذا أردنا استرداد مستند معين من مجموعة المخزون له قيمة الكمية الدقيقة "20" ، فسنقوم بإدخال الأمر التالي:

 db.inventory.find( { qty: { $eq: 20 } } )

سيعيد الاستعلام ما يلي:

 { _id: 2, item: { name: "banana", code: "123" }, qty: 20, tags: [ "B" ] }, { _id: 5, item: { name: "pears", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }

أكبر من ($ gt)

يتطابق عامل التشغيل هذا إذا كانت القيم أكبر من القيمة المحددة:

 { field: { $gt: value } }

في هذا المثال ، نسترجع المستندات التي تكون الكمية فيها أكبر من 15:

 db.inventory.find({"qty": { $gt: 15}})

سيعيد الاستعلام ما يلي:

 { _id: 2, item: { name: "banana", code: "123" }, qty: 20, tags: [ "B" ] } { _id: 3, item: { name: "spinach", code: "456" }, qty: 25, tags: [ "A", "B" ] } { _id: 4, item: { name: "lentils", code: "456" }, qty: 30, tags: [ "B", "A" ] } { _id: 5, item: { name: "pears", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }

أقل من (دولار لتر)

يتطابق عامل التشغيل هذا إذا كانت القيم أقل من القيمة المقدمة:

 { field: { $lt: value } }

لنجد المستندات بكمية أقل من 25:

 db.inventory.find({"qty": { $lt: 25}})

سيعيد الاستعلام ما يلي:

 { _id: 1, item: { name: "apple", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] } { _id: 2, item: { name: "banana", code: "123" }, qty: 20, tags: [ "B" ] } { _id: 5, item: { name: "pears", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }

أكبر أو يساوي (gte $)

يتطابق عامل التشغيل هذا عندما تكون القيم أكبر من القيمة المحددة أو مساوية لها:

 { field: { $gte: value } }

في هذا المثال ، نسترجع المستندات التي تكون الكمية فيها أكبر من أو تساوي 25:

 db.inventory.find({"qty": { $gte: 25}})

سيعيد هذا الاستعلام ما يلي:

 { _id: 3, item: { name: "spinach", code: "456" }, qty: 25, tags: [ "A", "B" ] } { _id: 4, item: { name: "lentils", code: "456" }, qty: 30, tags: [ "B", "A" ] }

أقل أو يساوي ($ lte)

يتطابق عامل التشغيل هذا فقط إذا كانت القيم أقل من القيمة المحددة أو مساوية لها:

 { field: { $lte: value } }

لنجد المستندات بكمية أقل من أو تساوي 25.

 db.inventory.find({"qty": { $lte: 25}})

يمكننا أن نتوقع من هذا الاستعلام إرجاع ما يلي:

 { _id: 1, item: { name: "apple", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] } { _id: 2, item: { name: "banana", code: "123" }, qty: 20, tags: [ "B" ] } { _id: 3, item: { name: "spinach", code: "456" }, qty: 25, tags: [ "A", "B" ] } { _id: 5, item: { name: "pears", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }

في ($ in)

يقوم عامل التشغيل هذا بإرجاع المستندات التي تطابق القيم المحددة:

 { field: { $in: [<value1>, <value2>, ... <valueN> ] } }

تساوي قيمة الحقل أي قيمة في الصفيف المحدد. لاسترداد المستندات ذات القيمتين "30" و "15" في مجموعة الجرد ، على سبيل المثال ، يمكنك القيام بما يلي:

 db.collection.find({ "qty": { $in: [30, 15]}})

سيكون الإخراج:

 { _id: 1, item: { name: "apple", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] } { _id: 4, item: { name: "lentils", code: "456" }, qty: 30, tags: [ "B", "A" ] }
يتم تشغيل الاستعلام في MongoDB Shell.

ليس في (تسعة دولارات)

يقوم عامل التشغيل هذا بإرجاع المستندات التي لا تتطابق مع القيم المحددة. إليك الصيغة الأساسية لعامل التشغيل $nin :

 { field: { $nin: [ <value1>, <value2> ... <valueN> ]

يختار $nin المستندات حيث:

  • قيمة الحقل ليست في المصفوفة المحددة ؛ أو
  • الحقل غير موجود.

إذا كان الحقل يحتوي على مصفوفات ، فسيختار المصفوفات التي لا يوجد بها عنصر محدد في قسم القيمة. على سبيل المثال ، نريد تحديد تلك المستندات التي لا تساوي فيها الكمية 20 أو 15.

بالإضافة إلى ذلك ، فإنه يتطابق أيضًا مع المستندات التي لا تحتوي على حقل كمية:

 db.collection.find({ "qty": { $nin: [ 20, 15 ]}}, {_id: 0})

سيكون الإخراج:

 { _id: 3, item: { name: "spinach", code: "456" }, qty: 25, tags: [ "A", "B" ] } { _id: 4, item: { name: "lentils", code: "456" }, qty: 30, tags: [ "B", "A" ] } { _id: 6, item: { name: "strawberry", code: "123" }, tags: [ "B" ] }

لا يساوي ($ ne)

يُرجع عامل التشغيل $ne المستندات التي لا تساوي فيها القيمة المحددة:

 { $ne: value } }

على سبيل المثال ، لنفترض أننا نريد تحديد جميع المستندات التي لا تساوي الكمية فيها 20:

 db.inventory.find( { qty: { $ne: 20 } } )

سيكون الإخراج:

 { _id: 1, item: { name: "apple", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] } { _id: 3, item: { name: "spinach", code: "456" }, qty: 25, tags: [ "A", "B" ] } { _id: 4, item: { name: "lentils", code: "456" }, qty: 30, tags: [ "B", "A" ] } { _id: 6, item: { name: "strawberry", code: "123" }, tags: [ "B" ] }

من الناتج أعلاه ، يمكننا أن نرى أن الاستعلام سيحدد المستندات التي لا تحتوي على حقل كمية.

عوامل تشغيل العنصر

يمكن لمشغلي استعلام العناصر تحديد المستندات باستخدام حقول المستند. تتكون عوامل تشغيل العناصر من $exist $type .

$ موجود

يطابق عامل التشغيل هذا المستندات التي تحتوي على حقل محدد. هذا العامل له قيمة منطقية يمكن أن تكون إما true أو false .

إذا تم تحديده ليكون true ، فإنه يطابق المستندات التي تحتوي على هذا الحقل ، بما في ذلك المستندات التي تكون فيها قيمة الحقل خالية. إذا كانت <boolean> false ، فسيعرض الاستعلام المستندات التي لا تحتوي على الحقل فقط.

إليك الصيغة القياسية:

 { field: { $exists: <boolean> } }

لنأخذ مثالاً حيث لدينا مجموعة بيانات لمصفوفة تسمى "bagofmarbles" ، حيث تحتوي كل حقيبة على كرات من الرخام بألوان مختلفة:

 { red: 5, green: 5, blue: null } { red: 3, green: null, blue: 8 } { red: null, green: 3, blue: 9 } { red: 1, green: 2, blue: 3 } { red: 2, blue: 5 } { red: 3, green: 2 } { red: 4 } { green: 2, blue: 4 } { green: 2 } { blue: 6 }

لنفترض أننا نريد استعلامًا يعيد فقط تلك الأكياس التي توجد بها الكرات الحمراء. هذا يعني أنه سيتعين علينا إدخال القيمة المنطقية على أنها true . لنلقي نظرة:

 db.bagofmarbles.find( { red: { $exists: true } } )

تتكون النتائج من تلك المستندات التي تحتوي على الحقل "أحمر" ، حتى لو كانت القيمة null . ومع ذلك ، فإنه لن يتكون من المستندات التي لم يكن فيها الحقل "أحمر" موجودًا:

 { red: 5, green: 5, blue: null } { red: 3, green: null, blue: 8 } { red: null, green: 3, blue: 9 } { red: 1, green: 2, blue: 3 } { red: 2, blue: 5 } { red: 3, green: 2 } { red: 4 }

إذا أردنا فقط تلك الحقائب التي لا توجد بها كرات حمراء كحقل ، فيمكننا إدخال الاستعلام أدناه:

 db.bagofmarbles.find( { red: { $exists: false} }

تتكون النتائج من تلك المستندات التي لا تحتوي على الحقل "أحمر":

 { green: 2, blue: 4 } { green: 2 } { blue: 6 }

نوع $

يطابق عامل التشغيل هذا المستندات وفقًا لنوع الحقل المحدد. يكون هذا مفيدًا عندما يكون لديك بيانات غير منظمة بشكل كبير ، أو عندما لا يمكن التنبؤ بأنواع البيانات. يتم تحديد أنواع الحقول هذه أنواع BSON ويمكن تحديدها إما عن طريق رقم النوع أو الاسم المستعار.

هذا هو التركيب العام $type :

 { field: { $type: <BSON type> } }

لنفترض أن لدينا دفتر عناوين يحتوي على المستندات أدناه:

 db={ addressBook: [ { "_id": 1, address: "2100 Jupiter Spot", zipCode: "9036325" }, { "_id": 2, address: "25 Moon Place", zipCode: 26237 }, { "_id": 3, address: "2324 Neptune Ring", zipCode: NumberLong(77622222) }, { "_id": 4, address: "33 Saturns Moon", zipCode: NumberInt(117) }, { "_id": 5, address: "1044 Venus Lane", zipCode: [ "99883637232", "73488976234" ] } ] }

عند مراقبة المستندات أعلاه ، يحتوي الرمز البريدي على أنواع بيانات مختلفة. يتضمن ذلك قيم طويلة ومزدوجة وعدد صحيح وسلسلة.

إذا أردنا فقط تلك المستندات التي تحتوي على نوع بيانات محدد كرمز بريدي - فلنأخذ سلسلة لهذا المثال - فسيتعين علينا إدخال الاستعلام التالي في المترجم:

 db.addressBook.find({ "zipCode": { $type: "string" } })

سيؤدي هذا إلى إرجاع المستندات التالية:

 [ { "_id": 1, "address": "2100 Jupiter Spot", "zipCode": "9036325" }, { "_id": 5, "address": "1044 Venus Lane", "zipCode": [ "99883637232", "73488976234" ] } ]
يتم تشغيل الاستعلام أعلاه في MongoDB Shell.

بالإضافة إلى ذلك ، هناك نوع "رقم" ، والذي يتضمن جميع القيم الطويلة أو الصحيحة أو المزدوجة كمصفوفة تحتوي على عنصر من الأنواع المحددة:

 db.addressBook.find( { "zipCode" : { $type : "number" } } )

انتاج:

 [ { "_id": 2, address: "25 Moon Place", zipCode: 26237 }, { "_id": 3, address: "2324 Neptune Ring", zipCode: NumberLong(77622222) }, { "_id": 4, address: "33 Saturns Moon", zipCode: NumberInt(117) } ]

إذا كانت المستندات تحتوي على نوع حقل مصفوفة ، فإن عامل التشغيل من $type يُرجع المستندات التي يتطابق فيها عنصر مصفوفة واحد على الأقل مع النوع الذي تم تمريره إلى المشغل.

عوامل صفيف

يتكون MongoDB أيضًا من عوامل تشغيل مصفوفة ، للاستعلام عن المستندات التي تحتوي على المصفوفات.

هناك ثلاثة عوامل تشغيل أساسية: $all و $elemMatch و $size . سنناقش كل واحد بالتفصيل أدناه.

$ الكل

يختار عامل التشغيل $all المستندات التي تكون فيها قيمة الحقل عبارة عن مصفوفة تحتوي على العناصر المحددة:

 { : { $all: [ <value1> , <value2> ... ] } }

على سبيل المثال ، لنفترض أن لدينا مجموعة من المستندات لمتجر ملابس ، مع ما يلي ضمن المخزون.

 { _id: ObjectId("5234cc89687ea597eabee675"), code: "shirt", tags: [ "sale", "shirt", "button", "y2k", "casual" ], qty: [ { size: "S", num: 10, color: "blue" }, { size: "M", num: 45, color: "blue" }, { size: "L", num: 100, color: "green" } ] }, { _id: ObjectId("5234cc8a687ea597eabee676"), code: "pant", tags: [ "y2k", "trendy", "shine" ], qty: [ { size: "6", num: 100, color: "green" }, { size: "6", num: 50, color: "blue" }, { size: "8", num: 100, color: "brown" } ] }, { _id: ObjectId("5234ccb7687ea597eabee677"), code: "pant2", tags: [ "trendy", "shine" ], qty: [ { size: "S", num: 10, color: "blue" }, { size: "M", num: 100, color: "blue" }, { size: "L", num: 100, color: "green" } ] }, { _id: ObjectId("52350353b2eff1353b349de9"), code: "shirt2", tags: [ "y2k", "trendy" ], qty: [ { size: "M", num: 100, color: "green" } ] }

نرغب في استرداد أي مستندات (في هذه الحالة ، الملابس) من المخزون المرتبطة بعلامتي "Trendy" و "y2k". يستخدم الاستعلام أدناه عامل التشغيل $all حيث تكون قيمة حقل العلامات عبارة عن مصفوفة تتضمن عناصرها "y2k" و "Trendy":

 db.inventory.find( { tags: { $all: [ "y2k", "trendy" ] } } )

يُرجع الاستعلام أعلاه ما يلي:

 { _id: ObjectId("5234cc8a687ea597eabee676"), code: "pant", tags: [ "y2k", "trendy", "shine" ], qty: [ { size: "6", num: 100, color: "green" }, { size: "6", num: 50, color: "blue" }, { size: "8", num: 100, color: "brown" } ] } { _id: ObjectId("52350353b2eff1353b349de9"), code: "shirt2", tags: [ "y2k", "trendy" ], qty: [ { size: "M", num: 100, color: "green" } ] }
يتم تشغيل الاستعلام أعلاه في MongoDB Shell.

من المثال أعلاه ، نجد أيضًا أن عامل التشغيل $all يؤدي ببساطة نفس وظيفة $and والعملية.

بدلاً من ذلك ، يمكننا استخدام الاستعلام أدناه الذي سيعطي نتيجة مماثلة لما سبق:

 db.collection.find({ $and: [ { tags: "y2k" }, { tags: "trendy" } ] })
يتم تشغيل الاستعلام أعلاه في MongoDB shell.

$ elemMatch

يطابق عامل التشغيل $elemMatch المستندات التي تحتوي على حقل مصفوفة مع عنصر واحد على الأقل يطابق جميع معايير الاستعلام المحددة:

 { : { $elemMatch: { <query1>, <query2>, ... } } }

في حين أننا قد نستخدم عوامل المقارنة مثل $lte و $gte ، إذا حددنا شرط استعلام واحد فقط داخل $elemMatch ، ولم نستخدم عامل التشغيل $not أو $ne ، فيمكن حذف استخدام $elemMatch لأنه سيؤدي بشكل أساسي إلى الأداء نفس الوظيفة.

هناك بعض الأشياء التي يجب وضعها في الاعتبار أثناء استخدام هذا العامل ، بشكل أساسي:

  • لا يمكنك تحديد تعبير $where في عملية $elemMatch .
  • لا يمكنك تحديد تعبير استعلام $text في عملية $elemMatch .

على سبيل المثال ، لدينا المستندات التالية في مجموعة نتائج الطلاب:

 { _id: 1, results: [ 92, 89, 98 ] } { _id: 2, results: [ 85, 99, 99 ] }

يتطابق الاستعلام التالي فقط مع المستندات التي تحتوي فيها مصفوفة النتائج على عنصر واحد على الأقل أكبر من أو يساوي 90 وأقل من 95:

 db.studentresults.find( { results: { $elemMatch: { $gte: 90, $lt: 95 } } })

يُرجع الاستعلام المستند التالي ، نظرًا لأن العنصر 92 أكبر من أو يساوي 90 وأقل من 95:

 { "_id" : 1, "results" :[ 92, 89, 98 ] }

حجم دولار

يُرجع عامل التشغيل $size المستندات التي يتطابق فيها حجم المصفوفة مع عدد العناصر المحددة في المتغير:

 { field: { $size: value } }

هذا مثال:

 db.collection.find( { field: { $size: 2 } });

سيؤدي هذا إلى إرجاع جميع المستندات في المجموعة المحددة حيث يكون الحقل عبارة عن مصفوفة تحتوي على عنصرين: { field: [ orange, apple] } و { field: [ blue, red] } ، ولكن ليس { field: blue} أو { field: [ raspberry, lemon, grapefruit ] } .

ومع ذلك ، بينما يمكننا إدخال القيمة المحددة كحجم ، لا يمكننا تحديد نطاقات القيم كحجم.

مشغلي الجغرافيا المكانية

يتيح لك MongoDB تخزين البيانات الجغرافية في شكل أنواع GeoJSON. GeoJSON هو تنسيق قياسي مفتوح يعتمد على تدوين كائن JavaScript الذي يمكن أن يمثل الميزات الجغرافية ويدعم السمات غير المكانية. هناك نوعان من العوامل الجغرافية المكانية التي سنتحدث عنها في هذه المقالة: محددات الهندسة ومحددات الاستعلام.

$ الهندسة

يذكر هذا المعامل هندسة GeoJSON للاستخدام مع عوامل الاستعلام الجغرافية التالية: $geoIntersects و $geoWithin و $nearSphere و $near . تستغل $geometry EPSG: 4326 كنظام مرجعي افتراضي للإحداثيات (CRS).

لذكر كائنات GeoJSON باستخدام CRS الافتراضي ، يمكنك الاستفادة من المقتطف التالي لـ $geometry :

 $geometry: { type: "<GeoJSON object type>", coordinates: [ <coordinates> ] }

لذكر مضلع GeoJSON أحادي الحلقة مع MongoDB CRS المخصص ، يمكنك استخدام المقتطف التالي (يمكنك فقط استخدام هذا لـ $geoWithin و $geoIntersects ):

 $geometry: { type: "Polygon", coordinates: [ <coordinates> ], crs: { type: "name", properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" } } }

مضلع $

يمكن استخدام عامل التشغيل $polygon لتحديد مضلع $geoWithin الجغرافي المكاني على أزواج الإحداثيات القديمة. سيعيد هذا الاستعلام بعد ذلك الأزواج التي تقع داخل حدود المضلع. ومع ذلك ، لن $polygon بالاستعلام عن أي كائنات GeoJSON. لتعريف مضلع ، تحتاج إلى تحديد مصفوفة من نقاط الإحداثيات على النحو التالي:

 { : { $geoWithin: { $polygon: [ [ <x1> , <y1> ], [ <x2> , <y2> ], [ <x3> , <y3> ], ... ] } } }

هنا ، النقطة الأخيرة مرتبطة ضمنيًا بالنقطة الأولى. يمكنك ذكر العديد من النقاط أو الجوانب كما تريد.

على سبيل المثال ، سيعيد الاستعلام التالي جميع المستندات التي تحتوي على إحداثيات موجودة داخل المضلع المحدد بواسطة [0،0] و [1،5] و [3،3]:

 db.places.find( { loc: { $geoWithin: { $polygon: [ [ 0 , 0 ], [ 1 , 5 ], [ 3 , 3 ] ] } } } )

$ geoWithin

يمكن استخدام هذا المشغل لاختيار المستندات التي تحتوي على بيانات جغرافية مكانية مضمنة بالكامل في شكل معين. يمكن أن يكون الشكل المحدد إما GeoJSON متعدد الأضلاع ، مضلع GeoJSON (إما متعدد الحلقات أو أحادي الحلقة) ، أو شكل يمكن تحديده بواسطة أزواج إحداثيات قديمة.

سيعمل عامل التشغيل $geoWithin على الاستفادة من عامل التشغيل $geometry $ للإشارة إلى كائن GeoJSON.

لذكر مضلعات GeoJSON المتعددة أو المضلعات عبر نظام الإحداثيات المرجعي الافتراضي (CRS) ، يمكنك استخدام الصيغة المذكورة أدناه:

 { : { $geoWithin: { $geometry: { type: <"Polygon" or "MultiPolygon"> , coordinates: [ <coordinates> ] } } } }

بالنسبة إلى استعلامات $geoWithin التي تذكر هندسة GeoJSON بمساحات أكبر من نصف كرة واحد ، قد يؤدي استخدام CRS الافتراضي إلى استعلامات عن الأشكال الهندسية التكميلية.

للإشارة إلى مضلع GeoJSON أحادي الحلقة مع MongoDB CRS المخصص ، يمكنك الاستفادة من النموذج الأولي المذكور أدناه في التعبير $geometry :

 { : { $geoWithin: { $geometry: { type: "Polygon" , coordinates: [ <coordinates> ], crs: { type: "name", properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" } } } } } }

يختار المثال التالي جميع البيانات المحلية الموجودة بالكامل داخل مضلع GeoJSON ، حيث تكون مساحة المضلع أقل من مساحة نصف كرة واحد:

 db.places.find( { loc: { $geoWithin: { $geometry: { type : "Polygon" , coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] } } } } )

مربع دولار

يمكنك استخدام $box لتحديد مستطيل لاستعلام جغرافي $geoWithin لتوفير المستندات التي تقع ضمن حدود المستطيل ، وفقًا لبيانات الموقع المستندة إلى النقطة. عند استخدام $geoWithin مع $box ، ستحصل على مستندات بناءً على إحداثيات الاستعلام. في هذا السيناريو ، لن $geoWithin بالاستعلام عن أي أشكال GeoJSON.

للاستفادة من عامل التشغيل $box ، عليك ذكر الزاويتين العلويتين اليمنى والسفلى اليسرى من المستطيل في كائن المصفوفة:

 { <location field> : { $geoWithin: { $box: [ [ <bottom left coordinates> ], [ <upper right coordinates> ] ] } } }

سيحسب الاستعلام المذكور أعلاه المسافة باستخدام الهندسة المستوية (المسطحة). سيعيد الاستعلام التالي جميع المستندات الموجودة داخل المربع التي تحتوي على نقاط في: [0،0]، [0،30]، [30،0]، [30،30]:

 db.places.find ( { loc: { $geoWithin: { $box: [ [ 0,0 ], [ 30,30 ] ] } } } )

$ nearSphere

يمكنك استخدام $nearSphere لذكر النقطة التي يقوم الاستعلام الجغرافي المكاني بإرجاع الوثائق من الأقرب إلى الأبعد.

تستخدم MongoDB الهندسة الكروية لحساب مسافات $nearSphere . سوف تحتاج إلى فهرس جغرافي مكاني على النحو التالي:

  1. الفهرس ثنائي الأبعاد لبيانات الموقع الموصوف كأزواج إحداثيات قديمة. للاستفادة من مؤشر ثنائي الأبعاد على نقاط GeoJSON ، تحتاج إلى إنشاء فهرس في حقل الإحداثيات لكائن GeoJSON.
  2. 2dsphere index لبيانات الموقع الموصوف كنقاط GeoJSON.

لذكر نقطة GeoJSON ، يمكنك الاستفادة من بناء الجملة التالي:

 { $nearSphere: { $geometry: { type : "Point", coordinates : [ <longitude>, <latitude> ] }, $minDistance: <distance in meters>, $maxDistance: <distance in meters> } }

هنا ، $minDistance و $maxDistance اختياريين. يمكن أن يقصر $minDistance النتائج على تلك المستندات التي هي على الأقل المسافة المحددة من المركز. يمكنك استخدام $maxDistance لأي من الفهرين.

الآن ، ضع في اعتبارك مجموعة من "الأماكن" التي تتكون من مستندات مع حقل موقع به فهرس 2dsphere. سيعيد المثال التالي النقاط التي يكون موقعها على الأقل 2000 متر وعلى الأكثر 6000 متر من النقطة التي تختارها ، مرتبة من الأقرب إلى الأبعد:

 db.places.find( { location: { $nearSphere: { $geometry: { type : "Point", coordinates : [ -43.9532, 50.32 ] }, $minDistance: 2000, $maxDistance: 6000 } } } )

$ geoIntersects

يتيح لك عامل التشغيل $geoIntersects اختيار المستندات التي تتقاطع بياناتها الجغرافية المكانية مع كائن GeoJSON معين (أي حيث يكون التقارب بين العنصر المحدد والبيانات غير فارغ). إنها تستفيد من عامل التشغيل $geometry لتحديد كائن GeoJSON.

لذكر مضلعات GeoJSON المتعددة أو المضلعات من خلال نظام مرجع الإحداثيات الافتراضي (CRS) ، يمكنك استخدام الصيغة التالية:

 { <location field>: { $geoIntersects: { $geometry: { type: "<GeoJSON object type>" , coordinates: [ <coordinates> ] } } } }

سيستخدم المثال التالي $geoIntersects لاختيار جميع بيانات الموقع التي تتقاطع مع المضلع الموصوف في صفيف الإحداثيات:

 db.places.find( { loc: { $geoIntersects: { $geometry: { type: "Polygon" , coordinates: [ [ [ 0, 0 ], [ 2, 6 ], [ 4, 1 ], [ 0, 0 ] ] ] } } } } )

مركز $

يشير عامل التشغيل $center إلى دائرة $geoWithin الذي يُرجع أزواج إحداثيات قديمة داخل حدود الدائرة.

لا يقوم $center بإرجاع كائنات GeoJSON. للاستفادة من عامل التشغيل $center ، تحتاج إلى تحديد مصفوفة تحتوي على:

  1. نصف قطر الدائرة ، كما تم قياسه بالوحدات التي يستخدمها نظام الإحداثيات.
  2. إحداثيات الشبكة لنقطة مركز الدائرة.
 { <location field> : { $geoWithin: { $center: [ [ <x> , <y> ] , <radius> ] } } }

سيعرض المثال المذكور أدناه جميع المستندات التي تحتوي على إحداثيات يمكن العثور عليها داخل الدائرة المتمركزة على [2،3] ونصف قطرها 40:

 db.places.find( { loc: { $geoWithin: { $center: [ [2, 3], 40 ] } } } )

مشغلي الإسقاط

يمكنك استخدام عوامل الإسقاط للإشارة إلى الحقول التي تم إرجاعها بواسطة العملية. تسمح عوامل الإسقاط MongoDB باستخدام وظيفة find() مع وسيطات تصفية البيانات. يساعد هذا المستخدمين على استخراج حقول البيانات المطلوبة فقط من المستند. لذلك ، فهي تتيح لك عرض بيانات شفافة وموجزة دون التأثير على الأداء العام لقاعدة البيانات.

$ elemMatch (إسقاط)

عامل التشغيل $elemMatch مسؤول عن تقييد محتوى الحقل من نتائج الاستعلام بحيث يحتوي فقط على العنصر الأول المطابق $elemMatch .

إليك بعض الأشياء التي يجب أن تضعها في اعتبارك قبل استخدام $elemMatch :

  • من MongoDB 4.4 ، بصرف النظر عن ترتيب الحقول في المستند ، يُرجع إسقاط $elemMatch للحقل الموجود الحقل بعد تضمين الحقول الموجودة الأخرى.
  • يصور كل من $elemMatch و $ أول عنصر مطابق من مصفوفة تعتمد على شرط محدد. سيعرض عامل التشغيل $ أول عنصر مصفوفة مطابق من كل مستند في مجموعة استنادًا إلى بعض الشروط من عبارة الاستعلام ، بينما يأخذ عامل الإسقاط $elemMatch وسيطة شرطية صريحة. يتيح لك هذا المشروع استنادًا إلى شرط غير موجود في الاستعلام ، أو إذا كنت بحاجة إلى المشروع بناءً على الحقول المختلفة في المستندات المضمنة للمصفوفة.

يجب أيضًا أن تكون على دراية بالقيود التالية قبل استخدام عامل التشغيل $elemMatch على بياناتك:

  • لا يمكنك ذكر تعبير استعلام $text ضمن عامل التشغيل $elemMatch .
  • عمليات db.collection.find() على طرق العرض لا تدعم عامل الإسقاط $elemMatch .

يفترض المثال التالي في عامل الإسقاط $elemMatch وجود schools تجميع بالمستندات التالية:

 { _id: 1, zipcode: "63108", students: [ { name: "mark", school: 102, age: 9 }, { name: "geoff", school: 101, age: 13 }, { name: "frank", school: 104, age: 12 } ] } { _id: 2, zipcode: "63110", students: [ { name: "harry", school: 103, age: 14 }, { name: "george", school: 103, age: 7 }, ] } { _id: 3, zipcode: "63108", students: [ { name: "harry", school: 103, age: 14 }, { name: "george", school: 103, age: 7 }, ] } { _id: 4, zipcode: "63110", students: [ { name: "jim", school: 103, age: 9 }, { name: "michael", school: 103, age: 12 }, ] }

في هذه الحالة ، استعلامات عملية find() لجميع المستندات حيث تكون قيمة حقل الرمز البريدي هي 63110. سيعيد إسقاط $elemMatch العنصر المطابق الأول فقط من صفيف students حيث يكون حقل school بقيمة 103:

 db.schools.find( { zipcode: "63110" }, { students: { $elemMatch: { school: 103 } } } ) This is what the result would look like: { "_id" : 2, "students" : [ { "name" : "harry", "school" : 103, "age" : 14 } ] } { "_id" : 4, "students" : [ { "name" : "jim", "school" : 103, "age" : 9 } ] }

شريحة $ (إسقاط)

يمكن استخدام عامل الإسقاط $slice لتحديد عدد العناصر في مصفوفة لإرجاعها في نتيجة الاستعلام:

 db.collection.find( <query> , { <arrayField> : { $slice: <number> } } );

يمكن أيضًا التعبير عنها بهذه الطريقة:

 db.collection.find( <query> , { <arrayField> : { $slice: [ <number> , <number> ] } } );

لإثبات ذلك ، يمكنك إنشاء مجموعة أمثلة من التغريدات بالمستندات التالية:

 db.posts.insertMany([ { _id: 1, title: "Nuts are not blueberries.", comments: [ { comment: "0. true" }, { comment: "1. blueberries aren't nuts."} ] }, { _id: 2, title: "Coffee please.", comments: [ { comment: "0. Indubitably" }, { comment: "1. Cuppa tea please" }, { comment: "2. frappucino" }, { comment: "3. Mocha latte" }, { comment: "4. whatever" } ] } ])

ستستخدم العملية التالية عامل الإسقاط $slice على مصفوفة التغريدات لإرجاع المصفوفة بعنصريها الأولين. إذا كانت المصفوفة تحتوي على أقل من عنصرين ، فسيتم إرجاع جميع العناصر في المصفوفة:

 db.posts.find( {}, { comments: { $slice: 2 } } )

ستعيد هذه العملية المستندات التالية:

 { "_id" : 1, "title" : "Nuts are not blueberries.", "comments" : [ { "comment" : "0. true" }, { "comment" : "1. blueberries aren't nuts." } ] } { "_id" : 2, "title" : "Coffee please.", "comments" : [ { "comment" : "0. Indubitably" }, { "comment" : "1. Cuppa tea please" } ] }

$ (إسقاط)

يحدد عامل التشغيل الموضعي $ محتويات المصفوفة لإرجاع العنصر الأول الذي يطابق شرط الاستعلام لتلك المصفوفة. يمكنك استخدام $ في مستند الإسقاط الخاص بالطريقة find() أو طريقة findOne() عندما تحتاج فقط إلى عنصر مصفوفة معين واحد في المستندات المختارة.

هذا ما تبدو عليه صيغة المعامل $ :

 db.collection.find( { <array>: <condition> ... }, { "<array>.$": 1 } ) db.collection.find( { <array.field>: <condition> ...}, { "<array>.$": 1 } )

في هذا المثال ، تتكون مجموعة students من المستندات التالية:

 { "_id" : 1, "semester" : 2, "grades" : [ 75, 67, 93 ] } { "_id" : 2, "semester" : 2, "grades" : [ 60, 68, 72 ] } { "_id" : 3, "semester" : 2, "grades" : [ 95, 82, 67 ] } { "_id" : 4, "semester" : 3, "grades" : [ 89, 95, 70 ] } { "_id" : 5, "semester" : 3, "grades" : [ 68, 98, 82 ] } { "_id" : 6, "semester" : 3, "grades" : [ 65, 70, 76 ] }

في الاستعلام التالي ، يعرض الإسقاط { "grades.$": 1 } العنصر الأول فقط أكبر من أو يساوي 89 لحقل grades :

 db.students.find( { semester: 2, grades: { $gte: 89 } }, { "grades.$": 1 } )

تُرجع هذه العملية المستندات التالية:

 {"_id": 3, "grades": [95] }

عوامل التقييم

يمكنك الاستفادة من عوامل تقييم MongoDB لقياس بنية البيانات الإجمالية أو الحقل الفردي داخل المستند.

لنلقِ نظرة على بعض عوامل تقييم MongoDB الشائعة.

$ وزارة الدفاع

يمكنك استخدام عامل التشغيل هذا لمطابقة المستندات حيث تكون قيمة الحقل المحدد مساوية للباقي بعد تقسيمها على قيمة محددة:

 { field: { $mod: [ divisor, remainder ] } }

لنفترض أن لديك طاولة سيارات تنتمي إلى ماركات مختلفة تمتلكها في صالة العرض الخاصة بك. يمنحك الاستعلام التالي جميع ماركات السيارات التي تكون أرقام مخزونها بمضاعفات 250.

 db.cars.find ( { qty: { $mod: [ 250,0 ] } } )

jsonSchema $

يتيح لك $jsonSchema مطابقة المستندات التي تطابق مخطط JSON المحدد. يتضمن تنفيذ MongoDB لمخطط JSON إضافة الكلمة الأساسية bsonType ، والتي تتيح لك استخدام جميع أنواع BSON داخل مشغل $jsonSchema .

يمكن أن يقبل bsonType نفس الأسماء المستعارة للسلسلة التي تستخدمها مع عامل تشغيل type . هذا ما ستبدو عليه $jsonSchema :

 { $jsonSchema: <JSON Schema object> }

هنا ، يتم تنسيق كائن مخطط JSON بناءً على المسودة 4 لمعيار مخطط JSON:

 { <keyword1>: <value1>, ... }

إليك مثال لتوضيح كيفية عمل $jsonSchema :

 { $jsonSchema: { required: [ "name", "major", "gpa", "address" ], properties: { name: { bsonType: "string", description: "must be a string and is required" }, address: { bsonType: "object", required: [ "zipcode" ], properties: { "street": { bsonType: "string" }, "zipcode": { bsonType: "string" } } } } } }

يمكنك أيضًا استخدام $jsonSchema في مدقق مستندات لفرض المخطط المحدد على عمليات التحديث والإدراج:

 db.createCollection(<collection> , { validator: { $jsonSchema: <schema> } } ) db.runCommand( { collMod: <collection>, validator:{ $jsonSchema: <schema> } } )

ضع في اعتبارك أن هناك عدة أشياء لا يدعمها عامل التشغيل $jsonSchema :

  1. نوع العدد الصحيح. تحتاج إلى الاستفادة من نوع BSON طويل أو int باستخدام الكلمة الأساسية bsonType.
  2. كلمات رئيسية غير معروفة.
  3. ربط الخصائص والوسائط التشعبية لمخطط JSON ، بالإضافة إلى استخدام مراجع JSON ومؤشرات JSON.

نص $

سيبحث عامل $text عن نص داخل محتوى الحقل المحدد ، مفهرسًا بفهرس نص:

 { $text: { $search: <string>, $language: <string>, $caseSensitive: <boolean>, $diacriticSensitive: <boolean> } }

في هذه الحالة ، سينتقل مقتطف الشفرة التالي عبر الجدول لتصفية أي سيارات بها نص "بورش":

 db.cars.find( { $text: { $search: "Porsche" } } )

$ regex

يوفر عامل التشغيل $regex إمكانيات التعبير العادي لنمط مطابقة السلاسل في الاستعلامات. تستفيد MongoDB من التعبيرات العادية المتوافقة مع Perl:

 {<field> : /pattern/ <options>}

سيساعد المثال التالي في تصفية جميع السيارات التي تحتوي على السلسلة "$ 78900" الموجودة فيها:

 db.cars.find( { price: { $regex: /$78900/ } } )

اكسبر $

يتيح لك عامل التشغيل $expr الاستفادة من تعبيرات التجميع في لغة الاستعلام:

 { $expr: { <expression> } }

يمكنك أيضًا استخدام $expr لإنشاء تعبيرات استعلام تقارن الحقول من نفس المستند في مرحلة $match . If the $match stage happens to be the part of a $lookup stage, $expr can compare fields with the help of let variables.

$where

You can leverage the $where operator to either pass a string containing a full JavaScript function or a JavaScript expression to the query system. The $where operator provides greater flexibility but needs the database to process the JavaScript function or expression for every document in the collection. You can reference this document in the JavaScript function or expression by using either obj or this .

Here's an example of the syntax:

 { $where: <string|JavaScript Code> }

There are a few key considerations to keep in mind before we dive into an example while using the $where operator:

  • You should only use the $where query operator to top-level documents. The $where query operator won't function in a nested document, like in a $elemMatch query.
  • Generally, you should use $where only when you cannot express your query via another operator. If you have to use $where , make sure you include at least one other standard query operator to filter the result set. Using $where independently requires a collection scan for proper execution.

Here's an example to illustrate this:

 db.cars.find( { $where: function() { return (hex_md5(this.name)== "9a43e617b50cd379dca1bc6e2a8") } } );

Bitwise Operators

Bitwise operators return data based on bit position conditions. Simply put, they are used to match numeric or binary values in which any bit from a set of bit positions has a value of 1 or 0.

$bitsAllSet

This operator will match all the documents where all of the bit positions provided by the query are set (ie 1) in the field:

{ <field> : { $bitsAllSet: <numeric bitmask> } }
 { <field> : { $bitsAllSet: < BinData bitmask> } }
 { <field> : { $bitsAllSet: [ <position1> , <position2> , ... ] } }

يجب أن تكون قيمة الحقل إما نسخة BinData أو رقمية لـ $bitsAllSet لتطابق المستند الحالي.

في المثال التالي ، نستفيد من مجموعة بالمستندات التالية:

 db.collection.save({ _id: 1, a: 54, binaryValueofA: "00110110" }) db.collection.save({ _id: 2, a: 20, binaryValueofA: "00010100" }) db.collection.save({ _id: 3, a: 20.0, binaryValueofA: "00010100" }) db.collection.save({ _id: 4, a: BinData(0, "Zg=="), binaryValueofA: "01100110" })

سيستخدم الاستعلام المذكور أدناه عامل التشغيل $bitsAllSet لاختبار ما إذا كان الحقل a به وحدات بت في الموضع 1 والموضع 5 ، حيث سيكون أقل البت أهمية في الموضع 0:

 db.collection.find( { a: { $bitsAllSet: [ 1, 5 ] } }

سيطابق هذا الاستعلام المستندات التالية:

 { "_id" : 1, "a" : 54, "binaryValueofA" : "00110110" } { "_id" : 4, "a" : BinData(0,"Zg=="), "binaryValueofA" : "01100110" }

bitsAllClear

سيطابق عامل التشغيل $bitsAllClear المستندات التي تكون فيها جميع مواضع البت التي يوفرها الاستعلام واضحة أو 0 :

 { <field> : { $bitsAllClear: <numeric bitmask> } }
 { <field> : { $bitsAllClear: < BinData bitmask> } }
 { <field> : { $bitsAllClear: [ <position1> , <position2> , ... ] } }

سنستخدم المثال المستخدم في $bitsAllSet هنا لتوضيح استخدام $bitsAllClear . سيستخدم الاستعلام التالي عامل التشغيل هذا للتحقق مما إذا كان الحقل أ به البتات واضحة في الموضعين 1 و 5:

 db.collection.find( { a: { $bitsAllClear: [ 1, 5 ] } } )

سيطابق هذا الاستعلام المستندات التالية:

 { "_id" : 2, "a" : 20, "binaryValueofA" : "00010100" } { "_id" : 3, "a" : 20, "binaryValueofA" : "00010100" }

عوامل التعريف

هناك العديد من مُعدِّلات الاستعلام التي تتيح لك تعديل سلوك أو إخراج استعلام في MongoDB. قد توفر واجهات برنامج التشغيل طرقًا للمؤشر تلتف بها لاستخدامك.

تلميح $

تم إهمال MongoDB $hint منذ الإصدار 3.2. ولكن ، قد يظل هذا المشغل متاحًا لسائقي MongoDB مثل Go ، و Java ، و Scala ، و Ruby ، ​​و Swift ، وما إلى ذلك ، ويمكنه إجبار مُحسِّن الاستعلام على الاستفادة من فهرس معين لتنفيذ الاستعلام ، والذي يمكن ذكره بعد ذلك إما عن طريق المستند أو بواسطة اسم الفهرس.

يمكنك أيضًا استخدام عامل $hint لاختبار إستراتيجيات الفهرسة وأداء الاستعلام. على سبيل المثال ، قم بالعملية التالية:

 db.users.find().hint( { age: 1 } )

ستعيد هذه العملية جميع المستندات داخل المجموعة التي تسمى users من خلال الاستفادة من الفهرس في حقل age .

يمكنك أيضًا ذكر تلميح باستخدام أي من النماذج التالية:

 db.users.find()._addSpecial( "$hint", { age : 1 } ) db.users.find( { $query: {}, $hint: { age : 1 } } )

إذا كان هناك عامل تصفية فهرس لشكل الاستعلام ، فإن MongoDB ببساطة سيتجاهل $hint .

تعليق $

يتيح لك عامل $comment إرفاق تعليق باستعلام في أي سياق قد يظهر فيه $query . نظرًا لأن التعليقات تنتشر في سجل الملف الشخصي ، فإن إضافة تعليق يمكن أن يسهل تفسير ملف التعريف الخاص بك وتتبعه.

يمكنك الاستفادة من $comment بإحدى الطرق الثلاث:

 db.collection.find( { <query> } )._addSpecial( "$comment", <comment> ) db.collection.find( { <query> } ).comment( <comment> ) db.collection.find( { $query: { <query> }, $comment: <comment> } )

إذا كنت تريد إرفاق تعليقات بتعبيرات الاستعلام في سياقات أخرى ، مثل db.collection.update() ، فاستخدم عامل تشغيل استعلام $comment بدلاً من عامل التشغيل الفوقي.

ماكس دولار

يمكنك ذكر قيمة $max لتحديد الحد الأعلى الحصري لفهرس معين لتقييد نتائج find() . سيحدد هذا المشغل الحد الأعلى لجميع المفاتيح ذات الترتيب المحدد في الفهرس.

يمنحك Mongosh طريقة التغليف max() التالية:

 db.collection.find( { <query> } ).max( { field1: <max value> , ... fieldN: <max valueN> } )

يمكنك أيضًا ذكر $max باستخدام النموذجين التاليين:

 db.collection.find( { <query> } )._addSpecial( "$max", { field1: <max value1> , ... fieldN: <max valueN> } ) db.collection.find( { $query: { <query> }, $max: { field1: <max value1> , ... fieldN: <max valueN> } } )

على سبيل المثال ، إذا كنت تريد تحديد الحد الأعلى الحصري ، فضع في اعتبارك العمليات التالية على مجموعة مسماة تحتوي على فهرس { age: 1 } :

 db.collection.find( { <query> } ).max( { age: 100 } ).hint( { age: 1 } )

ستحصر هذه العملية الاستعلام على تلك المستندات التي يكون عمر الحقل فيها أقل من 100 وتفرض خطة استعلام ستفحص فهرس { age: 1 } من minKey إلى 100.

شرح $

سيعطيك هذا العامل معلومات حول خطة الاستعلام. تقوم بإرجاع مستند يصف الفهارس والعمليات المستخدمة لإرجاع الاستعلام. يمكن أن يكون هذا مفيدًا عند محاولة تحسين استعلام.

يمكنك ذكر عامل $explain في أي من الأشكال التالية:

 db.collection.find()._addSpecial( "$explain", 1 ) db.collection.find( { $query: {}, $explain: 1 } )

أفضل الممارسات لمشغلي MongoDB

في هذا القسم ، سوف نلقي نظرة على بعض أفضل الممارسات أثناء استخدام مشغلي MongoDB.

التضمين والمراجع

التضمين هو امتداد طبيعي لنمذجة البيانات. يسمح لك بتجنب عمليات الانضمام إلى التطبيق ، مما قد يقلل من التحديثات والاستعلامات.

يمكنك تضمين البيانات بعلاقة 1: 1 في مستند واحد. ومع ذلك ، يمكن أيضًا أن تكون البيانات التي لها علاقة كثيرة: 1 والتي تظهر فيها كائنات "كثيرة" مع المستندات الأصلية مرشحة جيدة.

يبدو أن تخزين هذه الأنواع من البيانات في نفس المستند اختيار حكيم. ومع ذلك ، يوفر التضمين أداءً أفضل لعمليات القراءة مع هذا النوع من مواقع البيانات.

يمكن أن تساعد نماذج البيانات المضمنة المطورين أيضًا على تحديث البيانات المرتبطة في عملية كتابة واحدة. يعمل هذا لأن عمليات الكتابة في مستند واحد هي معاملات.

يجب أن تفكر في استخدام المراجع للسيناريوهات التالية:

  • عندما تقوم بتحديث مقطع من المستند ويستمر في الحصول على وقت أطول ، بينما يظل باقي المستند ثابتًا.
  • عند الوصول إلى مستند ولكنه يحتوي على بيانات نادرًا ما يتم استخدامها. لن يؤدي التضمين إلا إلى زيادة متطلبات الذاكرة ، لذا فإن الإحالة تكون أكثر منطقية.
  • عندما يتجاوز حجم المستند حد مستندات MongoDB البالغ 16 ميجابايت. يمكن أن يحدث هذا عند نمذجة العديد من العلاقات: 1 (على سبيل المثال ، الموظفون: القسم ).

افحص أنماط التنميط والاستعلام

بالنسبة لمعظم المطورين ، فإن الخطوة الأولى في تحسين الأداء هي فهم أنماط الاستعلام الفعلية والمتوقعة. بمجرد أن تعرف أنماط استعلام تطبيقك جيدًا بما فيه الكفاية ، يمكنك إنشاء نموذج بيانات واختيار المؤشرات المناسبة.

يتمتع مطورو MongoDB بإمكانية الوصول إلى العديد من الأدوات القوية التي تتيح لهم تحسين الأداء. لكن هذا لا يعني أنه يمكن تجاهل ملفات تعريف وأنماط الاستعلام.

على سبيل المثال ، تتمثل إحدى الطرق السهلة لتعزيز الأداء في تحليل أنماط الاستعلام وفهم المكان الذي يمكنك فيه تضمين البيانات. تتضمن الطرق الأخرى لتعزيز أداء MongoDB بعد تحديد أنماط الاستعلام الرئيسية ما يلي:

  • التأكد من وجود فهارس في أي حقول تستفسر عنها.
  • تخزين نتائج الاستعلامات الفرعية المتكررة على المستندات لتقليل حمل القراءة.
  • قم بإلقاء نظرة على السجلات الخاصة بك لإلقاء نظرة على الاستعلامات البطيئة ، ثم التحقق من الفهارس الخاصة بك.

مراجعة فهرسة البيانات والنمذجة

أثناء إنشاء نموذج البيانات ، ستقرر كيفية تصميم العلاقات بين البيانات. يعد اختيار وقت تضمين مستند مقابل إنشاء مرجع عبر مستندات منفصلة في مجموعات مختلفة بدلاً من ذلك ، على سبيل المثال ، مثالاً على الاعتبارات الخاصة بالتطبيق.

الميزة الرئيسية لوثائق JSON هي أنها تسمح للمطورين بنمذجة البيانات بناءً على متطلبات التطبيق. تساعدك المستندات الثانوية والمصفوفات المتداخلة على نمذجة العلاقات المعقدة بين البيانات عن طريق الاستفادة من المستندات النصية البسيطة.

يمكنك أيضًا استخدام MongoDB لنمذجة ما يلي:

  • البيانات الجغرافية المكانية
  • هياكل مجدولة ومسطحة وعمودية
  • أزواج بسيطة من المفاتيح والقيمة
  • بيانات السلاسل الزمنية
  • حواف وعقد هياكل بيانات الرسم البياني المتصلة وما شابه ذلك

مراقبة التقاسم والنسخ المتماثل

يمكن أن يكون النسخ المتماثل محوريًا لتحسين الأداء لأنه يزيد من توفر البيانات من خلال القياس الأفقي. يمكن أن يؤدي النسخ المتماثل إلى أداء أفضل ومزيد من الأمان من خلال التكرار.

يمكن أن تكون مراقبة الأداء مشكلة تتطلب موارد إضافية ووقتًا لضمان الأداء السلس. يمكنك الاستفادة من أدوات مراقبة الأداء المتوفرة في السوق والتي تلبي احتياجاتك الخاصة.

على سبيل المثال ، يمكن لـ Kinsta APM الحصول على معلومات ذات طابع زمني حول استعلامات قاعدة بيانات MySQL لموقع WordPress الخاص بك وعمليات PHP ومكالمات HTTP الخارجية وغير ذلك الكثير. يمكنك أيضًا استخدام هذه الأداة المجانية لتصحيح الأخطاء:

  • مكالمات API طويلة
  • طلبات URL الخارجية الطويلة
  • استعلامات قاعدة البيانات البطيئة على سبيل المثال لا الحصر.

في MongoDB ، يمكن تحقيق النسخ المتماثل من خلال مجموعات النسخ المتماثلة التي تسمح للمطورين بنسخ البيانات من عقدة أو خادم أساسي عبر ثوابت متعددة. يتيح هذا للنسخ المتماثل تشغيل بعض الاستعلامات في الثانوية بدلاً من الأساسي ، وتجنب الخلاف ويؤدي إلى موازنة أفضل للحمل.

تعد المجموعات المُقسمة في MongoDB طريقة أخرى لتحسين الأداء المحتمل. على غرار النسخ المتماثل ، يمكن استخدام التجزئة لتوزيع مجموعات البيانات الكبيرة عبر خوادم متعددة.

من خلال الاستفادة من مفتاح جزء ، يمكن للمطورين نسخ أجزاء أو أجزاء من البيانات عبر خوادم متعددة. يمكن أن تعمل هذه الخوادم معًا لاستخدام جميع البيانات.

تتمتع المشاركة بنصيبها العادل من المزايا ، بما في ذلك القياس الأفقي للكتابة / القراءة ، والتوافر الأعلى ، وزيادة سعة التخزين.

تحديد استخدام الذاكرة

تؤدي MongoDB بشكل أفضل عندما تتلاءم مجموعة عمل التطبيق (أي البيانات والمؤشرات التي يتم الوصول إليها بشكل متكرر) في الذاكرة دون مشكلة. في حين أن العوامل الأخرى محورية للأداء ، فإن حجم ذاكرة الوصول العشوائي هو الأكثر أهمية لحجم المثال.

عندما تتناسب مجموعة عمل التطبيق مع ذاكرة الوصول العشوائي ، يجب أن يكون نشاط القراءة من القرص منخفضًا. ولكن إذا تجاوزت مجموعة العمل الخاصة بك ذاكرة الوصول العشوائي لخادم المثيل أو حجمه ، فسيبدأ نشاط القراءة في الظهور.

إذا رأيت هذا يحدث ، فقد تتمكن من حل المشكلة بالانتقال إلى مثيل أكبر به ذاكرة أكبر.

ضع الحقول متعددة القيم في النهاية

إذا كنت تقوم بفهرسة حقلين ، وكان أحد الحقول التي تريد الاستعلام عنها يستخدم أحد عوامل التشغيل "متعددة القيم" ، فيجب عليك وضعها في نهاية الفهرس. تحتاج إلى طلب الفهرس بحيث تأتي الحقول التي تم الاستعلام عنها للقيم الدقيقة أولاً وتظهر عوامل التشغيل "متعددة القيم" أخيرًا في الفهرس.

استثناء لهذا سيكون الفرز مقابل الحقول. ضعها بين الحقول "متعددة القيم" والحقول الدقيقة لتقليل مقدار الفرز في الذاكرة المطلوب.

ملخص

بالنسبة إلى MongoDB ، السرعة هي اسم اللعبة. لإرجاع الاستعلامات بسرعة ، يستفيد MongoDB من المشغلين لتنفيذ المهام الرياضية أو المنطقية. ببساطة ، فهم مشغلي MongoDB هو مفتاح إتقان MongoDB.

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

من بين جميع المشغلين ، أي واحد (ق) تستخدمه غالبًا ، ولماذا؟ شارك في التعليقات أدناه - نود أن نسمع أفكارك!