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

السؤال

نشر (معدل)

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

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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...