Làm thế nào để loại bỏ phần tử mảng trong mongodb?


129

Đây là cấu trúc mảng

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

    ]
}

Ở đây tôi chỉ biết id mongo ( _id) và số điện thoại ( +1786543589455) và tôi cần xóa toàn bộ phần tử mảng tương ứng đó khỏi tài liệu. tức là phần tử được lập chỉ mục bằng 0 trong mảng điện thoại được khớp với số điện thoại và cần loại bỏ phần tử mảng tương ứng.

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

Tôi đã thử với phương pháp cập nhật sau

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

Nhưng nó loại bỏ number: +1786543589455khỏi đối tượng mảng bên trong, không phải là phần tử được lập chỉ mục bằng 0 trong mảng điện thoại. Đã thử pullcũng không thành công.

Làm thế nào để loại bỏ các phần tử mảng trong mongodb?

Câu trả lời:


237

Hãy thử truy vấn sau:

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

Nó sẽ tìm tài liệu với cái đã cho _idvà loại bỏ điện thoại +1786543589455khỏi contact.phonemảng của nó .

Bạn có thể sử dụng $unsetđể bỏ đặt giá trị trong mảng (đặt thành null), nhưng không loại bỏ hoàn toàn.


3
Cảm ơn bạn. Nó hoạt động tốt. Tôi đã cố gắng với { $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }{ $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }không thành công. Không hiểu làm việc của các nhà khai thác vị trí ở đây?
Justin John

1
Có gọi lại với điều này?
Oliver Dixon

1
@iLoveUnicorns bạn có thể thêm một cuộc gọi lại làm đối số thứ ba hoặc bạn có thể sử dụng lời hứa trả lại.
Leonid Beschastny

@LeonidBeschastny Tôi đã thử cái này. Trong trường hợp của tôi, tôi đã có nhiều tài liệu có cùng khóa. Tôi muốn $ kéo tất cả các tài liệu này nhưng truy vấn hiện tại chỉ thay đổi 1 tài liệu và sau đó dừng lại. Tôi cần những thay đổi gì?
Shubham A.

1
@ShubhamA. theo mặc định .update()cập nhật một tài liệu duy nhất. Để cập nhật nhiều tài liệu { multi: true }tùy chọn sử dụng . Xem db.collection.updatetài liệu để biết chi tiết .
Leonid Beschastny

14

Mã dưới đây sẽ xóa phần tử đối tượng hoàn chỉnh khỏi mảng, trong đó số điện thoại là '+1786543589455'

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

4

Trong Mongoose: từ tài liệu :

Để xóa tài liệu khỏi mảng văn bản con, chúng ta có thể truyền một đối tượng có dấu _id phù hợp.

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

Xem câu trả lời của Leonid Beschastny để có câu trả lời đúng.


3

Bạn chỉ có thể sử dụng $ pull để xóa tài liệu phụ. Toán tử $ pull loại bỏ khỏi một mảng hiện có tất cả các trường hợp của một giá trị hoặc các giá trị khớp với một điều kiện đã chỉ định.

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

Điều này sẽ tìm tài liệu gốc của bạn dựa vào ID đã cho và sau đó sẽ xóa phần tử khỏi subDocument phù hợp với tiêu chí đã cho.

Tìm hiểu thêm về kéo ở đây .


0

Nếu bạn sử dụng API Mongoose và đang tìm cách kéo đối tượng phụ / con: Đọc tài liệu này Đừng quên sử dụng save () khi bạn chỉnh sửa xong nếu không các thay đổi sẽ không được lưu vào cơ sở dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.