복붙노트

[MONGODB] 배열하여 MongoDB의 특정 필드 값으로 문서를 포함하지 않는 문서를 찾기

MONGODB

배열하여 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 } } } })

UPDATE : 실제로 수행 작업 위의 쿼리. 여러 번 공교롭게도, 내 데이터는, 내 코드 잘못이 아니었다.

나는 또한 $ 닌 오퍼레이터 살펴 보았다하지만 예는 배열이 기본 값이 아닌 추가 문서의 목록이 포함 된 경우 보여준다. 나는 다음과 같은이 작업을 수행하려고했습니다 때, 내가 원하는 정확한 문서보다는 푸 필드를 찾습니다.

db.collection.find({"docs": { $nin: {'foo':1 } } })

기본 운영자와이를 위해 어쨌든 있나요?

해결법

  1. ==============================

    1.$ 닌를 사용하여 작동하지만 당신은 구문 잘못이있을 것이다. 그것은해야한다:

    $ 닌를 사용하여 작동하지만 당신은 구문 잘못이있을 것이다. 그것은해야한다:

    db.collection.find({'docs.foo': {$nin: [1]}})
    
  2. ==============================

    2.은 $ 북동 연산자를 사용합니다 :

    은 $ 북동 연산자를 사용합니다 :

    db.collection.find({'docs.foo': {$ne: 1}})
    

    업데이트 :이 경우 $ 닌를 사용하여 무리를 줄 것입니다.

    { 'docs.foo': {$ NE : 1}} 문서의 모든 요소를 ​​소요하고 각 것이 푸 필드는 1 또는 같지 않음 여부를 체크한다. 일치하는 항목을 찾으면 결과 목록에서 문서를 삭제합니다.

    { 'docs.foo는'$ {닌은 : [1]}} 문서의 모든 요소를 ​​취하고, 그 푸 필드 배열 [1]의 멤버 중 하나와 일치하는지 여부를 각각의 요소에 대해이를 확인한다. 이것은 각 요소에, 다른 배열에 각 요소를 배열을 비교, 데카르트 제품입니다. MongoDB를 스마트하고이 쿼리를 최적화 할 수도 있지만, 나는 "이 배열 뭔가를 할 수있다"때문에 당신은 단지 $ 닌를 사용하는 가정합니다. 당신은 당신이 무엇을 이해한다면, 당신은 $ 닌이 불필요하고, 가능성이 평균 이하의 성능을 실현할 수 있습니다.

  3. from https://stackoverflow.com/questions/16221599/find-documents-with-arrays-not-containing-a-document-with-a-particular-field-val by cc-by-sa and MIT license