จะลบองค์ประกอบอาร์เรย์ใน mongodb ได้อย่างไร?


130

นี่คือโครงสร้างอาร์เรย์

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

    ]
}

ที่นี่ฉันรู้แค่รหัส mongo ( _id) และหมายเลขโทรศัพท์ ( +1786543589455) และฉันจำเป็นต้องลบองค์ประกอบอาร์เรย์ที่เกี่ยวข้องทั้งหมดออกจากเอกสาร กล่าวคือองค์ประกอบที่จัดทำดัชนีเป็นศูนย์ในอาร์เรย์โทรศัพท์ตรงกับหมายเลขโทรศัพท์และจำเป็นต้องลบองค์ประกอบอาร์เรย์ที่เกี่ยวข้อง

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

ฉันลองใช้วิธีการอัปเดตต่อไปนี้

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

แต่จะลบออก number: +1786543589455จากวัตถุอาร์เรย์ภายในไม่ใช่องค์ประกอบที่ทำดัชนีเป็นศูนย์ในอาร์เรย์โทรศัพท์ พยายามpullโดยไม่ประสบความสำเร็จ

จะลบองค์ประกอบอาร์เรย์ใน mongodb ได้อย่างไร?

คำตอบ:


238

ลองใช้แบบสอบถามต่อไปนี้:

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' } } }ไม่ประสบความสำเร็จ ไม่เข้าใจการทำงานของตัวดำเนินการตำแหน่งที่นี่?
Justin John

1
มีการโทรกลับด้วยสิ่งนี้หรือไม่?
Oliver Dixon

1
@iLoveUnicorns คุณสามารถเพิ่มการเรียกกลับเป็นอาร์กิวเมนต์ที่สามหรือคุณอาจใช้สัญญาที่ส่งคืน
Leonid Beschastny

@LeonidBeschastny ฉันลองสิ่งนี้ ในกรณีของฉันฉันมีเอกสารหลายฉบับที่มีรหัสเดียวกัน ฉันต้องการ $ ดึงเอกสารเหล่านี้ทั้งหมด แต่แบบสอบถามปัจจุบันเปลี่ยนเพียง 1 เอกสารแล้วหยุด ฉันต้องการการเปลี่ยนแปลงอะไร
Shubham A.

1
@ShubhamA โดยค่าเริ่มต้นจะ.update()อัปเดตเอกสารเดียว ในการอัปเดตเอกสารหลายชุดให้ใช้{ multi: true }ตัวเลือก ดูเอกสารสำหรับรายละเอียดdb.collection.update
Leonid Beschastny

14

รหัสด้านล่างนี้จะลบองค์ประกอบวัตถุทั้งหมดออกจากอาร์เรย์โดยที่หมายเลขโทรศัพท์คือ '+1786543589455'

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

4

ในพังพอน: จากเอกสาร :

ในการลบเอกสารออกจากอาร์เรย์เอกสารย่อยเราอาจส่งผ่านวัตถุที่มี _id ที่ตรงกัน

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

ดูคำตอบของ Leonid Beschastny สำหรับคำตอบที่ถูกต้อง


3

คุณสามารถใช้ $ pull เพื่อลบเอกสารย่อยได้ ตัวดำเนินการ $ pull ลบออกจากอาร์เรย์ที่มีอยู่ทุกอินสแตนซ์ของค่าหรือค่าที่ตรงกับเงื่อนไขที่ระบุ

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

สิ่งนี้จะค้นหาเอกสารหลักของคุณเทียบกับ ID ที่กำหนดจากนั้นจะลบองค์ประกอบออกจากเอกสารย่อยที่ตรงกับเกณฑ์ที่กำหนด

อ่านเพิ่มเติมเกี่ยวกับการดึงที่นี่


0

หากคุณใช้ Mongoose API และต้องการดึงอ็อบเจ็กต์ย่อย / ย่อย: อ่านเอกสารนี้ อย่าลืมใช้ save () เมื่อคุณแก้ไขเสร็จแล้วมิฉะนั้นการเปลี่ยนแปลงจะไม่ถูกบันทึกลงในฐานข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.