2012-03-14 2 views
20

내 데이터 구조는 다음과 같습니다.mongodb 및 pymongo에서 빈 문자열 테스트

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

""과 (와) 성이 다른 모든 행을 가져 오려고합니다. 그러나 이것은 효과가 없습니다. lastname이 ""이고 lastname이없는 경우 두 행을 반환합니다. 위의 예제에서 David 노드 만 얻고 싶습니다. 몽고 쉘에서

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

답변

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

(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 값에 대해 일치 (우리 또한 $ 제거 할 수는 "$ 네브라스카"로 존재 : 널 (null) 당신은 정규식 쿼리를 사용할 수 있습니다

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

파이썬에는 $ ne 주변의 따옴표가 필요합니다. 그래서 표현식 {$ ne : ""}은 level2_c가 ""이고 level2_c 노드가 존재하지 않을 때 true로 평가됩니다. 그래서 나는 이것을 { "level2_c": { "$ exists": True}, "level1_b.level2_c": { "$ ne": "}}와 같이 필터링해야했습니다. 이것은 작동하지만 다소 추한 것 같습니다. –

+1

나는 몽고 껍질에서 시험하고 있었다. 당신이 정답을 발견해서 다행입니다. – Kyle

+0

감사합니다. 나는 약간의 질문을 명확히했다. 다시 봐주실 수 있습니까? { "lastname": { "$ exists": True}, "lastname": { "$ ne": ""}}보다 나은 답변이 있습니까? –

0

이의 처리)한다 :

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

이 정규식은 시작 또는 0 또는 N 공백 (.|\s)로 끝나는 문자열과 일치하며 중간에 \S 하나 이상의 비 - 공백해야합니다.