programing

MongoDB에서 특정 필드 값을 가진 문서가 포함되지 않은 배열 문서를 찾습니다.

mytipbox 2023. 2. 27. 23:24
반응형

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

반응형