2012-03-14 5 views
20

Oto moja struktura danych.Test pusty ciąg w mongodb i pymongo

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

"Nazwisko" jest czasami obecne, a czasami nie, a czasami jest "".

Chcę, aby wszystkie wiersze, które mają nazwisko nie są równe "". Ale to nie działa. Zwraca oba wiersze, gdy nazwisko jest "" i kiedy nazwisko w ogóle nie występuje. w powyższym przykładzie chcę dostać tylko węzeł David.

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

Odpowiedz

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

W powłoce Mongo (Id za pominięte w celu zaoszczędzenia miejsca)

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

W przypadku, chcemy także, aby odfiltrować mecze na wartości null trzeba dostosować kryteria następująco (my można też pozbyć $ istnieje jako „$ ne”: null dba o to)

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

Cytaty około $ ne są potrzebne dla Pythona. więc wyrażenie {$ ne: ""} sprawdza się jako prawdziwe, zarówno gdy level2_c jest "", jak i wtedy, gdy węzeł level2_c nie istnieje. Musiałem więc odfiltrować je w ten sposób {"level2_c": {"$ exists": True}, "level1_b.level2_c": {"$ ne": ""}}. to działa, ale wygląda nieco brzydko. –

+1

Testowałem z powłoki mongo. Cieszę się, że znalazłeś poprawną odpowiedź. – Kyle

+0

Dzięki. Trochę to wyjaśniłem. czy możesz ponownie spojrzeć na to. czy jest lepsza odpowiedź niż ta: {"lastname": {"$ exists": True}, "lastname": {"$ ne": ""}}? –

0

można użyć kwerendy regex:

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

Ten regex dopasowuje ciągi rozpoczynające się lub kończące się 0 lub n whitespaces (.|\s) i to musi być jeden lub więcej nie-spacji \S w środku.