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

حذف عنصر من مصفوفة فرعية في mongodb

Tamim Fahed

السؤال

لدي مستند فيه مصفوفات بالشكل التالي:

address: {
    localAddresses: [
        {
            street: "St123",
            city: "New Jersey",
            country: "USA"
        }
        {
            street: "Ava Revenue-111",
            city: "Houston",
            country: "USA"
        }

    ]
}

وأحاول إزالة الحقل street من المصفوفة localAdresses من خلال استخدام unset كالتالي:

update(
    { _id: id},
    { $unset: { 'address.localAddresses.$.street': 'Ava Revenue-111'} }
);

ولكن لم يتم إزالة هذا الحقل بشكل كامل من المصفوفة. كيف يمكنني إزالته بالشكل الصحيح؟

تم التعديل في بواسطة Tamim Fahed
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

يمكنك استخدام التابع pull كالتالي:

update(
  { _id: id },
  { $pull: { 'address.localAddresses': { street: 'Ava Revenue-111' } } }
);

حيث ستقوم بالبحث عن المستند من خلال الرقم المعرّف الفريد id، وتقوم بإزالة الحقل street والقيمة الموافقة له من المصفوفة localAddresses. والتي تم الوصول إليها عن طريق استخدام dot notation ( address.localAddresses)

لأنه عند استخدام unset سيبقى الحقل street موجود كونه من أصل بنية المستند ضمن هذه المصفوفة الفرعية ولكن عندها سيتم وضع القيمة null بدلاً من القيمة "Ava Revenue-111"

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

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

db.coll.find({_id:id}).forEach( function(doc) {
  const arr = doc.address.localAddresses;
  const length = arr.length;
  for (var i = 0; i < length; i++) {
    if( arr[i]["street"] === 'Ava Revenue-111'){
    delete arr[i]["street"];
    }
  }
  db.coll.save(doc);
});

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

إبتداءً من الإصدار 3.6 اصبح بالإمكان التعديل على عدة عناصر بداخل مصفوفة بحيث يُمكنك إستخدام positional identifier بالشكل التالي:

db.collection.update({},
{
  $unset: {
    "address.localAddresses.$[].street": true
  }
})

$[] تقوم بحذف كل الخاصيات street من المصفوفة localAddresses، يعمل كعنصر نائب لتحديث جميع العناصر في المصفوفة.

بإمكانك تجربة المثال من: هنا

إن أردت الحذف المتعدد من عدة مستندات إستخدم multi: true بالشكل التالي:

db.collection.update({},
{
  $unset: {
    "address.localAddresses.$[].street": true
  }
},
{ multi: true })
رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...