2012-03-14 20 views
20

Aquí está mi estructura de datos.Prueba cadena vacía en mongodb y pymongo

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

"lastname" a veces está presente y algunas veces no y en algún momento es "".

Quiero obtener todas las filas que tienen el apellido no igual a "". Pero esto no funciona. Devuelve las dos filas cuando el apellido es "" y cuando el apellido no está presente en absoluto. en el ejemplo anterior solo quiero obtener el nodo David.

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

Respuesta

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

En la consola mongo (de Identificación omitido para ahorrar espacio)

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

En caso de que también desea que se corten los partidos contra los valores nulos que necesita para ajustar los criterios de la siguiente manera (que también puede deshacerse de $ existe como "$ ne": null se encarga de esto)

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

se necesitan presupuestos de $ ne para python. por lo que la expresión {$ ne: ""} se evalúa como verdadera tanto cuando level2_c es "" como cuando level2_c node no existe para comenzar. Así que tuve que filtrarlos así {"level2_c": {"$ exists": True}, "level1_b.level2_c": {"$ ne": ""}}. esto funciona pero parece algo feo. –

+1

Estaba probando desde el shell mongo. Me alegro de que hayas encontrado la respuesta correcta. – Kyle

+0

Gracias. Aclaré la pregunta un poco. ¿Puedes mirarlo de nuevo? ¿hay una mejor respuesta que esta: {"lastname": {"$ exists": True}, "lastname": {"$ ne": ""}}? –

0

puede utilizar una consulta de expresiones regulares:

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

Esta expresión coincide con cadenas que comienzan o terminan con 0 o N espacios en blanco (.|\s) y que tiene que ser uno o más espacios en blanco no-\S en el medio.

Cuestiones relacionadas