Mongo에서 "null이 아닌"을 어떻게 쿼리합니까?


답변:


812

"IMAGE URL"이라는 키가있는 모든 문서를 반환하지만 여전히 null 값을 가질 수 있습니다.

db.mycollection.find({"IMAGE URL":{$exists:true}});

"IMAGE URL"이라는 키 null이 아닌 값 이 모두있는 모든 문서를 반환합니다 .

db.mycollection.find({"IMAGE URL":{$ne:null}});

또한 문서에 따르면 $ exists는 현재 인덱스를 사용할 수 없지만 $ ne는 사용할 수 있습니다.

편집 :이 답변에 관심이 있기 때문에 몇 가지 예 추가

이러한 인서트가 주어지면 :

db.test.insert({"num":1, "check":"check value"});
db.test.insert({"num":2, "check":null});
db.test.insert({"num":3});

이렇게하면 세 문서가 모두 반환됩니다.

db.test.find();

첫 번째와 두 번째 문서 만 반환합니다.

db.test.find({"check":{$exists:true}});

첫 번째 문서 만 반환합니다.

db.test.find({"check":{$ne:null}});

두 번째와 세 번째 문서 만 반환됩니다.

db.test.find({"check":null})

12
문서에 따르면 $ne 필드가 포함되지 않은 문서를 포함합니다 . 답변을 게시 한 이후로 변경 되었습니까? docs.mongodb.org/manual/reference/operator/query/ne
Andrew Mao

2
나는 그것이 변했다고 믿지 않는다. $ ne을 검사 할 때 필드를 포함하지 않는 문서를 포함하여 모든 문서에서 값이 검사되지만 $ ne : null은 필드 값이 여전히 null이므로 필드를 포함하지 않은 문서와 여전히 일치하지 않습니다. 해당 문서에 필드가 존재하지 않더라도
Tim Gautier

2
두 번째 문서는 어떻게 일치합니까?
BT

1
@River 필자는 3 년 전에이 글을 쓸 때 확인했으며, 확실하게 Mongo를 설치하고 다시 시도했습니다. 그것은 여전히 ​​똑같은 방식으로 작동합니다. 정답입니다. 마지막에서 두 번째 쿼리는 첫 번째 문서 만 반환합니다.
Tim Gautier

1
주어진 예제는 이것을 사용하는 방법을 실제로 이해할 수있게합니다. :-)
Eric Dela Cruz

92

하나의 라이너가 최고입니다.

db.mycollection.find({ 'fieldname' : { $exists: true, $ne: null } });

여기,

내 컬렉션 : 원하는 컬렉션 이름을 입력하십시오

분야 명 : 원하는 필드 이름을 입력하십시오

설명 :

존재하는 $ : true 인 경우 $ exists는 필드 값이 널인 문서를 포함하여 필드를 포함하는 문서와 일치합니다. false 인 경우, 조회는 필드를 포함하지 않은 문서 만 리턴합니다.

$ ne 은 필드 값이 지정된 값과 다른 문서를 선택합니다. 필드가 포함되지 않은 문서가 포함됩니다.

따라서 제공된 경우 다음 쿼리는 imageurl 필드가 있고 null 값이없는 모든 문서를 반환합니다.

db.mycollection.find({ 'imageurl' : { $exists: true, $ne: null } });

11
$exists: true중복, $ne: null충분하다.
Stanislav Karakhanov

이것이 가장 좋은 대답이어야합니다. 값도 $exists: true반환 null합니다. 모두있을 가지고 $exists: true$ne: null. 중복되지 않습니다.
Ismail Kattakath

47

pymongo에서는 다음을 사용할 수 있습니다.

db.mycollection.find({"IMAGE URL":{"$ne":None}});

pymongo는 mongo "null"을 python "None"으로 표시하기 때문입니다.


18
db.collection_name.find({"filed_name":{$exists:true}});

이 파일이 포함 된 문서를 가져옵니다.

내 제안 :

db.collection_name.find({"field_name":{$type:2}}) //type:2 == String

필수 속성 유형을 확인할 수 있습니다. 필드 유형이 일치하지 않는 경우 파일 유형을 확인하기 때문에 field_name이 조회 한 field_name에 값이 포함 된 모든 문서를 리턴합니다. 유형 조건이 일치하지 않으면 아무 것도 리턴되지 않습니다.

Nb : field_name에 ""을 의미하는 빈 문자열이 있으면 반환됩니다.

db.collection_name.find({"filed_name":{$ne:null}});

추가 검증 :

좋아, 아직 끝나지 않았으니 추가적인 조건이 필요하다.

db.collection_name.
find({ "field_name":{$type:2},$where:"this.field_name.length >0"})

또는

db.collection_name.
find({ "field_name":{$ne:null},$where:"this.field_name.length >0"})

참고


14

미래 독자를위한 공유.

이 쿼리는 우리에게 효과적 이었습니다 ( MongoDB compass 에서 실행 된 쿼리 ) :

{
  "fieldName": {
    "$nin": [
      "",
      null
    ]
  }
}

1
{$ exists : true, $ ne : null} 올바른 결과를 표시하지 않았습니다. 귀하의 질의는 훌륭합니다
Oleksandr Buchek

1
$ nin은 종종 인덱스보다 최적화되지 않습니다.
Wheezil

4
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})

유효한 Json 문서입니까? 쿼리 문서에서 이름이 같은 두 속성 필요한 경우 메모리에 어떻게 빌드할지 확실하지 않습니다.
BrentR

4

이상적인 경우에는 null , "" 또는 비어있는 세 가지 을 모두 테스트하려고 합니다 . (필드는 레코드에 존재하지 않음)

다음을 수행 할 수 있습니다.

db.users.find({$and: [{"name" : {$nin: ["", null]}}, {"name" : {$exists: true}}]})

3

언급되지 않았지만 일부에 대해 더 효율적인 옵션 (NULL 항목으로는 작동하지 않음)은 희소 색인 을 사용하는 것 입니다 ( 색인의 항목은 필드에 무언가가있을 때만 존재합니다). 다음은 샘플 데이터 세트입니다.

db.foo.find()
{ "_id" : ObjectId("544540b31b5cf91c4893eb94"), "imageUrl" : "http://example.com/foo.jpg" }
{ "_id" : ObjectId("544540ba1b5cf91c4893eb95"), "imageUrl" : "http://example.com/bar.jpg" }
{ "_id" : ObjectId("544540c51b5cf91c4893eb96"), "imageUrl" : "http://example.com/foo.png" }
{ "_id" : ObjectId("544540c91b5cf91c4893eb97"), "imageUrl" : "http://example.com/bar.png" }
{ "_id" : ObjectId("544540ed1b5cf91c4893eb98"), "otherField" : 1 }
{ "_id" : ObjectId("544540f11b5cf91c4893eb99"), "otherField" : 2 }

이제 imageUrl 필드에 희소 색인을 작성하십시오.

db.foo.ensureIndex( { "imageUrl": 1 }, { sparse: true } )
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

이제는 색인을 사용하는 대신 MongoDB가 잠재적 인 대상 인덱스 쿼리에 대해서도 테이블 스캔을 사용할 가능성이 항상 있습니다 (특히 샘플과 같은 작은 데이터 세트의 경우). 그것이 차이점을 설명하는 쉬운 방법을 제공한다는 것이 밝혀졌습니다.

db.foo.find({}, {_id : 0, imageUrl : 1})
{ "imageUrl" : "http://example.com/foo.jpg" }
{ "imageUrl" : "http://example.com/bar.jpg" }
{ "imageUrl" : "http://example.com/foo.png" }
{ "imageUrl" : "http://example.com/bar.png" }
{  }
{  }

추가 문서가없는 imageUrl 가 반환되지 않고 비어있는 상태로 반환됩니다. 이유를 확인하기 위해 설명하십시오.

db.foo.find({}, {_id : 0, imageUrl : 1}).explain()
{
    "cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 6,
    "nscannedObjects" : 6,
    "nscanned" : 6,
    "nscannedObjectsAllPlans" : 6,
    "nscannedAllPlans" : 6,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "server" : "localhost:31100",
    "filterSet" : false
}

따라서 예 BasicCursor는 테이블 스캔과 같으며 인덱스를 사용하지 않았습니다. 쿼리에서 희소 인덱스를 사용하여hint() 다음 .

db.foo.find({}, {_id : 0, imageUrl : 1}).hint({imageUrl : 1})
{ "imageUrl" : "http://example.com/bar.jpg" }
{ "imageUrl" : "http://example.com/bar.png" }
{ "imageUrl" : "http://example.com/foo.jpg" }
{ "imageUrl" : "http://example.com/foo.png" }

그리고 우리가 찾고 있던 결과가 있습니다-필드가 채워진 문서 만 반환됩니다. 또한 인덱스 만 사용하므로 (즉, 해당 인덱스 쿼리) 인덱스 만 메모리에 있어야 결과를 반환 할 수 있습니다.

이것은 특수한 사용 사례이며 일반적으로 사용할 수 없습니다 (해당 옵션에 대한 다른 답변 참조). 특히 물건이 서있는 것처럼 count()이 방법으로 사용할 수 없으므로 (예를 들어 4가 아니라 6을 반환 할 것이므로) 적절한 경우에만 사용하십시오.


텍스트 필드는 항상 희소 색인이므로 명시 적으로 지정할 필요는 없습니다. 내 2 센트 만.
alianos-

3

몽고 나침반에서 열의 존재를 확인하는 가장 간단한 방법은 다음과 같습니다.

{ 'column_name': { $exists: true } }

1
이 문제는 필드가 실제로 지속되지 않았다고 가정하지만 OP는 헤드 라인에서 존재할 수 있지만 명시 적으로 null로 설정할 수 있음을 나타냅니다.
Carighan

-10

쿼리는

db.mycollection.find({"IMAGE URL":{"$exists":"true"}})

"IMAGE URL"을 키로하는 모든 문서를 반환합니다 ...........


1
@kilianc 사실이 아닙니다. $ exists는 null 값도 캡처합니다. docs.mongodb.org/manual/reference/operator/query/exists
dorvak

@dorvak 정확하게, 그것이 질문의 유스 케이스를 만족시키지 않는 이유입니다.
kilianc

이 답변은 $exists키를 확인하고 "IMAGE URL"값 ( null)을 고려하지 않기 때문에 잘못되었습니다. 으로 문서를 반환합니다 "IMAGE URL" : null.
David Hariri 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.