mongodb에서 배열 요소를 제거하는 방법은 무엇입니까?


129

다음은 배열 구조입니다.

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

    ]
}

여기서는 mongo id ( _id)와 phone number ( +1786543589455) 만 알고 있으며 문서에서 해당 배열 요소 전체를 제거해야합니다. 즉, 전화 배열의 인덱스 요소가 0이면 전화 번호와 일치하며 해당 배열 요소를 제거해야합니다.

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

다음 업데이트 방법으로 시도했습니다.

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

그러나 그것은 number: +1786543589455전화 배열의 0 인덱싱 요소가 아닌 내부 배열 객체에서 제거 됩니다. pull성공하지 않고 시도했습니다 .

mongodb에서 배열 요소를 제거하는 방법은 무엇입니까?

답변:


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' } } }성공하지 않고. 여기서 위치 연산자의 작동을 이해하지 못합니까?
Justin John

1
이것에 대한 전화가 있습니까?
Oliver Dixon

1
@iLoveUnicorns 세 번째 인수로 콜백을 추가하거나 반환 된 promise를 사용할 수 있습니다.
Leonid Beschastny

@LeonidBeschastny 나는 이것을 시도했다. 제 경우에는 동일한 키를 가진 여러 문서가 있습니다. 이 모든 문서를 $ pull하고 싶지만 현재 쿼리는 한 문서 만 변경 한 다음 중지합니다. 어떤 변화가 필요합니까?
Shubham A.

1
@ShubhamA. 기본적 .update()으로 단일 문서를 업데이트합니다. 여러 문서를 업데이트하려면 { multi: true }옵션을 사용하십시오 . 자세한 내용은 db.collection.update문서를 참조하십시오 .
Leonid Beschastny

14

아래 코드는 전화 번호가 '+1786543589455'인 배열에서 전체 개체 요소를 제거합니다.

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

4

Mongoose : 문서에서 :

하위 문서 배열에서 문서를 제거하기 위해 일치하는 _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.