web-dev-qa-db-fra.com

Testez une chaîne vide dans mongodb et pymongo

Voici ma structure de données. 

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

"nom" est parfois présent et parfois pas et parfois "".

Je veux obtenir toutes les lignes dont le nom est différent de "". Mais ça ne marche pas. Il renvoie les deux lignes lorsque lastname est "" et quand lastname n'est pas présent du tout. Dans l'exemple ci-dessus, je souhaite uniquement obtenir le nœud David.

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

Dans le shell mongo (les identifiants sont omis pour économiser de l'espace)

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

Si vous souhaitez également filtrer les correspondances avec les valeurs NULL, vous devez ajuster les critères comme suit (nous pouvons également supprimer débarras de $ existe comme "$ ne": null s'en occupe)

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