70 votes

Tester les chaînes vides dans mongodb et pymongo

Voici ma structure de données.

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

"lastname" est parfois présent et parfois non, et est parfois "".

Je veux récupérer toutes les lignes dont le nom de famille n'est pas égal à "". Mais cela ne fonctionne pas. Il renvoie à la fois les lignes où lastname est "" et celles où lastname n'est pas du tout présent. Dans l'exemple ci-dessus, je ne veux obtenir que le nœud David.

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

150voto

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

Dans le shell Mongo (les identifiants sont omis pour gagner de la place)

> 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 des valeurs nulles, vous devez ajuster les critères comme suit (nous pouvons également nous débarrasser de $exists comme "$ne" : null s'en charge)

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

15voto

Face à ce problème, j'ai pensé à une autre solution :

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

Avec cela, je n'ai pu obtenir que le chaînes non vides Il ignore également les champs nuls et inexistants, car toute valeur imprimable (ASCII) a une valeur supérieure à celle de l'espace (32).

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

2voto

Marcos Godinho Points 66

Vous pouvez utiliser une requête de type "regex" :

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

Cette expression rationnelle correspond aux chaînes de caractères commençant ou se terminant par 0 ou N espaces blancs. (.|\s) et il doit s'agir d'un ou de plusieurs espaces non blancs \S au milieu.

1voto

Jadboy20 Points 3

Je ne sais pas si cela peut aider, mais cela a fonctionné pour moi. La regex .+ renvoie tout ce qui contient plus d'un caractère, alors que .* renvoie 0 ou plus. Il ne renverra donc rien qui soit inférieur à 0 caractère.

En ce qui concerne les chaînes ne contenant que des espaces blancs, je ne pense pas que cette solution puisse les gérer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X