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
'Programming' 카테고리의 다른 글
Android는 EditText에 자리 표시 자 텍스트 추가 (0) | 2020.03.02 |
---|---|
쿼리 문자열 매개 변수를 추가하거나 업데이트하려면 어떻게합니까? (0) | 2020.03.02 |
내 앱의 갤러리 (SD 카드)에서 이미지를 선택하는 방법은 무엇입니까? (0) | 2020.03.02 |
FlexBox 내부에서 텍스트를 세로로 정렬하는 방법은 무엇입니까? (0) | 2020.03.02 |
Flask에서 쿼리 문자열을 어떻게 얻습니까? (0) | 2020.03.02 |