programing

mongodb 및 pymongo에서 빈 문자열 테스트

yellowcard 2023. 5. 20. 10:37
반응형

mongodb 및 pymongo에서 빈 문자열 테스트

여기 제 데이터 구조가 있습니다.

[{
"name": "David",
"lastname": "",
},
{
"name": "Angela"
}]

"성"은 때때로 존재하지만 때로는 존재하지 않으며 때로는 ""입니다.

성이 ""와 같지 않은 모든 행을 가져오려고 합니다.하지만 이것은 효과가 없습니다.성이 "일 때와 성이 전혀 없을 때 두 행을 모두 반환합니다. 위의 예에서는 David 노드만 가져오려고 합니다.

db.collection.find( {"lastname": {"$ne": ""}} )
db.collection.find({"lastname" : {"$exists" : true, "$ne" : ""}})

mongo 셸에서(공간 절약을 위해 id가 생략됨)

> db.collection.find()
  { "name" : "Angela" }
  { "name" : "David", "lastname" : "" }
  { "name" : "Kyle",  "lastname" : "Test" }
  { "name" : "John",  "lastname" : null }

> db.collection.find({"lastname" : {"$exists" : true, "$ne" : ""}})
  { "name" : "Kyle", "lastname" : "Test" }
  { "name" : "John",  "lastname" : null }

null 값에 대한 일치 항목도 필터링하려면 다음과 같이 기준을 조정해야 합니다($exists를 "$ne"로 제거할 수도 있습니다: null이 이를 처리합니다).

> db.collection.find({$and:[{"lastname": {"$ne": null}}, {"lastname": {"$ne": ""}}]})
  { "name" : "Kyle", "lastname" : "Test" }

이 문제에 직면하여 저는 다른 해결책을 생각했습니다.

db.collection.find({"lastname": {"$gte": " "}})

인쇄 가능한 값(ASCII)은 공백(32)보다 큰 값을 가지고 있기 때문에 빈 문자열만 얻을 수 있고 null 및 존재하지 않는 필드도 무시할 수 있습니다.

https://en.wikipedia.org/wiki/ASCII

정규식 쿼리를 사용할 수 있습니다.

db.test.find({ "lastname": /(.|\s)*\S(.|\s)*/ })

이 정규식은 0 또는 N개의 공백으로 시작하거나 끝나는 문자열과 일치합니다.(.|\s)하나 이상의 공백이 있어야 합니다.\S가운데에.

이것이 도움이 될지는 모르겠지만, 저에게는 효과가 있었습니다.정규식.+하나 이상의 문자를 포함하는 모든 문자를 반환하는 반면.*0 이상을 반환합니다.따라서 0자 미만은 반환하지 않습니다.

공백만 포함된 문자열의 경우 이 솔루션으로는 처리할 수 없다고 생각합니다.

언급URL : https://stackoverflow.com/questions/9694223/test-empty-string-in-mongodb-and-pymongo

반응형