Programming

Mongo에서“null이 아님”을 어떻게 쿼리합니까?

procodes 2020. 3. 2. 13:18
반응형

Mongo에서“null이 아님”을 어떻게 쿼리합니까?


다음 쿼리를 실행하고 싶습니다.

db.mycollection.find(HAS IMAGE URL)

올바른 구문은 무엇입니까?


"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})

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

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

여기,

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

fieldname : 원하는 필드 이름을 입력하십시오

설명 :

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

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

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

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

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

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

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


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"})

모든 유형에 대한 참조 : https://docs.mongodb.com/manual/reference/operator/query/type/#op._S_type


미래 독자를위한 공유.

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

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

언급되지 않았지만 일부 항목에 더 효율적인 옵션 (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을 반환 할 것이므로) 적절한 경우에만 사용하십시오.


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

쿼리는

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

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

참고 URL : https://stackoverflow.com/questions/4057196/how-do-you-query-for-is-not-null-in-mongo



반응형