اذهب إلى المحتوى

السؤال

نشر

لدي مجموعة من المستندات مكوّنة من البنية التالية:

{  
   "_id":ObjectId("e7c5942f08fe44c621912952"),
   "boxTitle": "Box1",
   "balls":[  
      {  
         "number":"1",
         "color":"blue"
      },
      {  
         "number":"2",
         "color":"red"
      }
   ]
},

وأحاول الحصول على المستندات التي تحقق شرط عناصر محددة من المصفوفة balls. ولكن عندما أقوم بتجربة الاستعلام التالي:

find({"balls.color": "red"}, {"balls.color": 1})

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

كيف يمكنني تحقيق ذلك؟

Recommended Posts

  • 0
نشر

يمكن استعمال المعامل and$ الذي يقبل مصفوفة تحوي على التعابير الشرطية، لتصبح العبارة كالتالي:

find( $and: [{"balls.color": "red"}, {"balls.color": 1}])

أو ربما أنت تقصد كتابة الشرط هكذا:

find({"balls.color": "red", "balls.color": 1})

حيث تمرر الخاصيات و القيم جميعها بعنصر واحد.

  • 1
نشر

يتم تطبيق selection في mongodb بدءً من طبقة المستندات.

لذلك عندما نقوم بكتابة الاستعلام {"balls.color": "red"} سيتم إعادة (المستند) الذي يحقق هذا الشرط كاملاً دون تطبيق أي شروط أو فلتر على المصفوفات ضمنه. أما في حالتك فأنت ترغب أيضاً بإجراء فلتر على عناصر المصفوفة ضمن هذا المستند الذي سيتم إرجاعه. ويمكن في هذه الحالة استخدام elemMatch والذي سيعيد أول عنصر محقق لهذا الشرط فقط:

find({"balls.color": "red"}, {_id: 0, balls: {$elemMatch: {color: "red"}}});

وفي حال كانت النسخة لديك أقدم من 2.2 فلن تستطيع استخدام elemMatch، يمكنك بشكل مشابه استخدام projection مع المعامل $ كالتالي:

find({"balls.color": "red"}, {_id: 0, 'color.$': 1});

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...