মংডোবিতে অ্যারে উপাদানটি কীভাবে সরিয়ে ফেলবেন?


129

এখানে অ্যারে কাঠামো

contact: {
    phone: [
        {
            number: "+1786543589455",
            place: "New Jersey",
            createdAt: ""
        }
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }

    ]
}

এখানে আমি কেবল মঙ্গো আইডি ( _id) এবং ফোন নম্বর ( +1786543589455) জানি এবং ডকুমেন্ট থেকে আমার পুরো সম্পর্কিত অ্যারে উপাদানটি সরিয়ে ফেলতে হবে। অর্থাত্ ফোন অ্যারেতে শূন্য সূচকযুক্ত উপাদানটি ফোন নম্বরটির সাথে মিলেছে এবং সংশ্লিষ্ট অ্যারে উপাদানটি সরিয়ে ফেলতে হবে।

contact: {
    phone: [
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }
    ]
}

আমি নিম্নলিখিত আপডেট পদ্ধতি দিয়ে চেষ্টা করেছি

collection.update(
    { _id: id, 'contact.phone': '+1786543589455' },
    { $unset: { 'contact.phone.$.number': '+1786543589455'} }
);

তবে এটি number: +1786543589455ফোন অ্যারেতে শূন্য সূচকযুক্ত উপাদান নয়, অভ্যন্তরীণ অ্যারে অবজেক্ট থেকে সরিয়ে দেয় । pullসাফল্য ছাড়াও চেষ্টা করা ।

মংডোবিতে অ্যারে উপাদানটি কীভাবে সরিয়ে ফেলবেন?

উত্তর:


237

নিম্নলিখিত কোয়েরি চেষ্টা করুন:

collection.update(
  { _id: id },
  { $pull: { 'contact.phone': { number: '+1786543589455' } } }
);

এটি প্রদত্ত সহ নথির সন্ধান করবে _idএবং ফোনটিকে +1786543589455তার contact.phoneঅ্যারে থেকে সরিয়ে ফেলবে ।

আপনি $unsetঅ্যারেতে মানটি আনসেট করতে ব্যবহার করতে পারেন (এটি সেট করুন null), তবে এটি সম্পূর্ণরূপে অপসারণ করার জন্য নয়।


3
ধন্যবাদ. এটা দুর্দান্ত কাজ করে। আমি চেষ্টা করেছিলাম { $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }এবং { $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }কোন সাফল্য ছাড়াই। এখানে অবস্থানিক অপারেটরদের কাজ বুঝতে পারছেন না?
জাস্টিন জন

1
এই সাথে কি আবার কল আছে?
অলিভার ডিকসন

1
@ iLoveUnicorns আপনি তৃতীয় যুক্তি হিসাবে কলব্যাক যোগ করতে পারেন, বা আপনি প্রত্যাশিত প্রতিশ্রুতি ব্যবহার করতে পারেন।
লিওনিড বেসচাস্টনি

এই টুইটটি দেখুন আমার ক্ষেত্রে, আমি একই কী সহ একাধিক নথি করেছি। আমি এই সমস্ত নথি টানতে চাইছি তবে বর্তমান ক্যোয়ারীটি কেবলমাত্র 1 টি দস্তাবেজ পরিবর্তন করে এবং তারপর থামবে। আমার কী পরিবর্তন দরকার?
শুভম এ

1
@ShubhamA। ডিফল্টরূপে .update()একটি একক দস্তাবেজ আপডেট হয়। একাধিক ডকুমেন্ট আপডেট করতে { multi: true }বিকল্প ব্যবহার করুন । db.collection.updateবিশদ জন্য ডক্স দেখুন ।
লিওনিড বেসচাস্টনি

14

নীচের এই কোডটি অ্যারে থেকে সম্পূর্ণ অবজেক্ট উপাদানটি সরিয়ে ফেলবে, যেখানে ফোন নম্বরটি '+1786543589455'

db.collection.update(
  { _id: id },
  { $pull: { 'contact': { number: '+1786543589455' } } }
);

4

মঙ্গুজে: দস্তাবেজ থেকে :

সাব-ডকুমেন্ট অ্যারে থেকে একটি দস্তাবেজ সরাতে আমরা একটি ম্যাচ _আইডের সাথে একটি বস্তুটি পাস করতে পারি।

contact.phone.pull({ _id: itemId }) // remove
contact.phone.pull(itemId); // this also works

সঠিক উত্তরের জন্য লিওনিড বেসচাস্টির উত্তর দেখুন।


3

সাব-ডকুমেন্টটি সরাতে আপনি সহজেই টানতে পারেন। $ পুল অপারেটর একটি বিদ্যমান শর্ত থেকে একটি মান বা মানগুলির একটি সুনির্দিষ্ট শর্তের সাথে মিলে যায় ances

Collection.update({
    _id: parentDocumentId
  }, {
    $pull: {
      subDocument: {
        _id: SubDocumentId
      }
    }
  });

এটি প্রদত্ত আইডির বিপরীতে আপনার পিতামাতার দস্তাবেজটি খুঁজে পাবে এবং তারপরে প্রদত্ত মানদণ্ডের সাথে মিলে যাওয়া সাব-ডকুমেন্ট থেকে উপাদানটি সরিয়ে ফেলবে।

এখানে টান সম্পর্কে আরও পড়ুন ।


0

আপনি যদি মঙ্গুজ এপিআই ব্যবহার করেন এবং সাব / চাইল্ড অবজেক্টটি টানতে চাইছেন: এই নথিটি পড়ুন যখন আপনি সম্পাদনা শেষ করেছেন সেভ () সংরক্ষণ করতে ভুলবেন না অন্যথায় পরিবর্তনগুলি ডাটাবেসে সংরক্ষণ করা হবে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.