MongoDB에서 특정 필드 값을 가진 문서가 포함되지 않은 배열 문서를 찾습니다.
특정 필드 값을 가진 문서가 하나 이상 포함되지 않은 모든 문서를 찾으려고 합니다.예를 들어, 다음은 샘플 수집입니다.
{ _id : 1,
docs : [
{ foo : 1,
bar : 2},
{ foo : 3,
bar : 3}
]
},
{ _id : 2,
docs : [
{ foo : 2,
bar : 2},
{ foo : 3,
bar : 3}
]
}
문서 블록에 foo = 1인 레코드가 하나 이상 포함되지 않은 문서가 없는 모든 레코드를 찾습니다.위의 예에서는 두 번째 문서만 반환해야 합니다.
다음을 시도했지만 일치하지 않는 항목(문서 1이 반환됨)만 표시됩니다.
db.collection.find({"docs": { $not: {$elemMatch: {foo: 1 } } } })
업데이트: 위의 쿼리는 실제로 작동합니다.대부분의 경우, 내 데이터는 잘못된 것이지, 내 코드는 아닙니다.
$nin 연산자도 살펴보았습니다만, 이 예시는 배열에 추가 문서가 아닌 원시 값 목록이 포함되어 있는 경우에만 표시됩니다.이 작업을 다음과 같은 방법으로 수행하려고 하면 원하는 foo 필드뿐만 아니라 EXCLUT 문서를 검색합니다.
db.collection.find({"docs": { $nin: {'foo':1 } } })
기본 오퍼레이터와 함께 이를 달성할 수 있는 방법이 있습니까?
를 사용하면 동작하지만 구문이 틀립니다.다음 중 하나여야 합니다.
db.collection.find({'docs.foo': {$nin: [1]}})
연산자를 사용합니다.
db.collection.find({'docs.foo': {$ne: 1}})
업데이트: 를 사용하지 않는 것이 좋습니다.$nin
이 경우는,
{'docs.foo': {$ne: 1}}
모든 요소를 받아들이다docs
, 그리고 각각에 대해서, 이 체크가 행해지고 있는지 아닌지를 확인합니다.foo
필드는 1 또는 1이 아닙니다.일치하는 항목을 찾으면 결과 목록에서 문서를 삭제합니다.
{'docs.foo': {$nin: [1]}}
모든 요소를 받아들이다docs
, 각 요소에 대해서, 그 유무에 대해 체크합니다.foo
필드가 배열 멤버 중 하나와 일치합니다.[1]
이것은 데카르트 제품입니다.배열을 다른 배열과 비교하고 각 요소를 각 요소에 비교합니다.MongoDB가 스마트하고 이 쿼리를 최적화할 수 있지만, 저는 당신이 단지 사용한다고 생각합니다.$nin
"어레이와 관련된 문제"이기 때문입니다.하지만 여기서 하는 일을 이해한다면$nin
불필요한 퍼포먼스를 가지고 있을 가능성이 있습니다.
언급URL : https://stackoverflow.com/questions/16221599/find-documents-with-arrays-not-containing-a-document-with-a-particular-field-val
'programing' 카테고리의 다른 글
Oracle에서 캐시된 모든 항목을 지우는 방법 (0) | 2023.03.04 |
---|---|
대규모 데이터 세트(angular.js)에 비해 ngRepeat의 성능을 향상시키는 방법 (0) | 2023.02.27 |
워드프레스 분류법 제목 출력 (0) | 2023.02.27 |
빈 필드를 사용하여 AngularJS 오더바이 (0) | 2023.02.27 |
MongoDB는 어레이를 어떻게 인덱스합니까? (0) | 2023.02.27 |