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.