2017-11-24 5 views
0

객체가 있고 그 객체 내에 객체 배열이 있습니다. 배열 내에서 단일 객체를 제거하려고합니다. 내 코드는 이제 전체 개체를 제거하고 이유를 모르겠습니다. 이견있는 사람?배열 내의 객체 제거

예 : Collection example

"profiles": { 
    "names": [ 
    { 
     "first": "Joe", 
     "last": "First", 
     "uniqueId": "075ae7fda11" 
    }, 
    { 
     "first": "Sam", 
     "last": "Last", 
     "uniqueId": "1488096533" 
    } 
    ] 
} 

예. Update method

MyCollection.update({_id: userId}, { 
    $unset: { 
    profiles: { 
     'names.$.first': 'Joe' 
    } 
    } 
}); 
+0

"나는 왜 그런지 모르겠다. - 문서를 읽지 않았기 때문이다. "$ unset 표현식 (즉," ")에 지정된 값이 작업에 영향을 미치지 않습니다." 그래서 거기에 'profile'에 값으로 전달하는 것이 중요하지 않습니다. 하위 문서 전체가 제거됩니다. 그것은'$ unset'이하는 일입니다. –

+0

예. 그걸로'Joe'가있는 전체 객체를 제거해야한다는 의미는 아닙니다. 'profiles' 객체 전체를 제거하지 않습니까 ?? – bp123

+0

아니요, 당신이 설정을 해제했다고 말했기 때문에 엔트리'프로파일 '을 제거합니다. –

답변

2

사용 $pull 연산자는 일치하는 모든 개체를 제거합니다. $unset이를 대체

MyCollection.update({_id: userId}, { 
    "$pull": { 
    "profiles.names": { 
     "first": "Joe" 
    } 
    } 
}); 

check docs

MyCollection.update({_id: userId,"profiles.names.first":"Joe"},{ 
    "$unset":{ 
     "profiles.names.$":"" 
    } 
}); 

중요 참고 배열 필드는 쿼리 문서의 일부로서 나타나야합니다 당신은 업데이트 작업으로 위치 $ 연산자를 사용 .When $unset를 사용하여 단일 개체를 제거하려면 배열에서 일치하는 요소를 제거하는 대신 null로 요소를 일치시킵니다. 이 동작은 배열 크기와 요소 위치를 일관되게 유지합니다.

그래서 위의 쿼리의 실행은 당신의 이름 배열을 업데이트 할 것입니다 그리고 그것은 다음과 같이 표시됩니다, 아직 완전히 monngodb에서 지원되지 않는 개체를 제거하기

"profiles": { 
    "names": [ 
    null, 
    { 
     "first": "Sam", 
     "last": "Last", 
     "uniqueId": "1488096533" 
    } 
    ] 
} 

오픈 버그 참조 : https://jira.mongodb.org/browse/SERVER-1014

1

을 이것은 할 수있는 방법입니다.

MyCollection.update({ _id: userId) }, 
    { 
     "$pull": 
      { 
       "profiles.names": 
        { 
         "first": "Joe" 
        } 
      } 
    }); 
0

$ pull은 배열에서 요소를 제거합니다.

$ unset은 전체 배열 (또는 다른 필드)을 제거합니다.