Je ne pense pas que cela ait changé. Lors de la vérification de $ ne, la valeur est vérifiée dans tous les documents, y compris ceux qui ne contiennent pas le champ, mais $ ne: null ne correspondra toujours pas à un document qui ne contient pas le champ puisque la valeur du champ est toujours nulle, même si le champ n'existe pas dans ce document.
Tim Gautier
2
Comment faites-vous simplement correspondre le deuxième document?
BT
1
@River J'ai vérifié quand j'ai écrit cela il y a 3 ans et, juste pour être sûr, je viens d'installer Mongo et de le réessayer. Cela fonctionne toujours de la même manière, la réponse est correcte. L'avant-dernière requête renvoie uniquement le 1er document.
Tim Gautier
1
Les exemples donnés rendent vraiment compréhensible comment l'utiliser. :-)
mycollection : placez le nom de votre collection souhaitée
nomchamp : placez votre nom de champ désiré
Explication:
$ existe : Quand est vrai, $ existe correspond aux documents qui contiennent le champ, y compris les documents où la valeur du champ est nulle. Si est faux, la requête renvoie uniquement les documents qui ne contiennent pas le champ.
$ ne sélectionne les documents dont la valeur du champ n'est pas égale à la valeur spécifiée. Cela inclut les documents qui ne contiennent pas le champ.
Donc, dans votre cas fourni, la requête suivante qui va retourner tous les documents avec le champ imageurl existe et n'a pas de valeur nulle:
Ce devrait être la meilleure réponse. $exists: truerenvoie nullégalement des valeurs. Il doit y avoir à la fois $exists: trueet $ne: null. Ce n'est PAS redondant.
Ismail Kattakath
47
Dans pymongo, vous pouvez utiliser:
db.mycollection.find({"IMAGE URL":{"$ne":None}});
Parce que pymongo représente mongo "null" comme python "None".
Vous pouvez vérifier le type d'attribut requis, il renverra tous les documents que son champ_nom interrogé contient une valeur parce que vous vérifiez sur le type du dossier sinon s'il est nul la condition de type ne correspond pas donc rien ne sera retourné.
Nb : si le champ_nom a une chaîne vide qui signifie "", il sera retourné. C'est le même comportement pour
Est-ce un document Json valide? Deux propriétés portant le même nom dans le document de requête. Je ne sais pas comment vous pourriez construire cela en mémoire si vous deviez.
BrentR
4
Dans un cas idéal, vous souhaitez tester les trois valeurs , null , "" ou vide (le champ n'existe pas dans l'enregistrement)
Une alternative qui n'a pas été mentionnée, mais qui peut être une option plus efficace pour certains (ne fonctionnera pas avec les entrées NULL) est d'utiliser un index clairsemé (les entrées dans l'index n'existent que lorsqu'il y a quelque chose dans le champ). Voici un exemple d'ensemble de données:
Maintenant, il y a toujours une chance (et en particulier avec un petit ensemble de données comme mon échantillon) qu'au lieu d'utiliser un index, MongoDB utilise un scan de table, même pour une requête d'index couvert potentiel. Il s'avère que cela me donne un moyen facile d'illustrer la différence ici:
Et c'est le résultat que nous recherchions - seuls les documents avec le champ renseigné sont retournés. Cela utilise également uniquement l'index (c'est-à-dire qu'il s'agit d'une requête d'index couverte), donc seul l'index doit être en mémoire pour renvoyer les résultats.
Il s'agit d'un cas d'utilisation spécialisé et ne peut pas être utilisé généralement (voir les autres réponses pour ces options). En particulier, il convient de noter que dans l'état actuel des choses, vous ne pouvez pas utiliser count()de cette manière (pour mon exemple, il retournera 6 et non 4), veuillez donc utiliser uniquement lorsque cela est approprié.
Le problème avec cela est qu'il suppose que le champ n'a vraiment jamais été persisté, mais l'OP semble indiquer (à partir du titre) qu'il pourrait exister mais être défini explicitement sur null.
@dorvak exactement, c'est pourquoi cela ne satisfera pas le cas d'utilisation de la question.
kilianc le
Cette réponse est fausse parce que $existsvérifie la clé "IMAGE URL"et ne prennent pas en compte la valeur de ce ( null) et se retourner un document "IMAGE URL" : null.
{ field : {$ne : null} }
vérifie la valeur non nulle de docs.mongodb.org/manual/reference/operator/query/neRéponses:
Cela renverra tous les documents avec une clé appelée "URL IMAGE", mais ils peuvent toujours avoir une valeur nulle.
Cela renverra tous les documents avec à la fois une clé appelée "URL IMAGE" et une valeur non nulle.
De plus, selon les documents, $ existe actuellement ne peut pas utiliser d'index, mais $ ne le peut.
Edit: Ajout de quelques exemples en raison de l'intérêt pour cette réponse
Compte tenu de ces inserts:
Cela renverra les trois documents:
Cela renverra uniquement les premier et deuxième documents:
Cela ne retournera que le premier document:
Cela renverra uniquement les deuxième et troisième documents:
la source
$ne
inclut les documents qui ne contiennent pas le champ . Cela a-t-il changé depuis que vous avez publié la réponse? docs.mongodb.org/manual/reference/operator/query/neUn liner est le meilleur:
Ici,
mycollection : placez le nom de votre collection souhaitée
nomchamp : placez votre nom de champ désiré
Explication:
$ existe : Quand est vrai, $ existe correspond aux documents qui contiennent le champ, y compris les documents où la valeur du champ est nulle. Si est faux, la requête renvoie uniquement les documents qui ne contiennent pas le champ.
$ ne sélectionne les documents dont la valeur du champ n'est pas égale à la valeur spécifiée. Cela inclut les documents qui ne contiennent pas le champ.
Donc, dans votre cas fourni, la requête suivante qui va retourner tous les documents avec le champ imageurl existe et n'a pas de valeur nulle:
la source
$exists: true
est redondant,$ne: null
suffit.$exists: true
renvoienull
également des valeurs. Il doit y avoir à la fois$exists: true
et$ne: null
. Ce n'est PAS redondant.Dans pymongo, vous pouvez utiliser:
Parce que pymongo représente mongo "null" comme python "None".
la source
récupérer les documents qui contiennent ce nom_de_fichier même s'il est nul.
Ma proposition:
Vous pouvez vérifier le type d'attribut requis, il renverra tous les documents que son champ_nom interrogé contient une valeur parce que vous vérifiez sur le type du dossier sinon s'il est nul la condition de type ne correspond pas donc rien ne sera retourné.
Nb : si le champ_nom a une chaîne vide qui signifie "", il sera retourné. C'est le même comportement pour
Validation supplémentaire:
D'accord, nous n'avons donc pas encore terminé, nous avons besoin d'une condition supplémentaire.
OU
Référence
la source
Cette requête a fonctionné pour nous (requête exécutée à partir de la boussole MongoDB ):
la source
la source
Dans un cas idéal, vous souhaitez tester les trois valeurs , null , "" ou vide (le champ n'existe pas dans l'enregistrement)
Vous pouvez effectuer les opérations suivantes.
la source
Une alternative qui n'a pas été mentionnée, mais qui peut être une option plus efficace pour certains (ne fonctionnera pas avec les entrées NULL) est d'utiliser un index clairsemé (les entrées dans l'index n'existent que lorsqu'il y a quelque chose dans le champ). Voici un exemple d'ensemble de données:
Maintenant, créez l'index clairsemé sur le champ imageUrl:
Maintenant, il y a toujours une chance (et en particulier avec un petit ensemble de données comme mon échantillon) qu'au lieu d'utiliser un index, MongoDB utilise un scan de table, même pour une requête d'index couvert potentiel. Il s'avère que cela me donne un moyen facile d'illustrer la différence ici:
OK, donc les documents supplémentaires sans
imageUrl
sont retournés, juste vides, pas ce que nous voulions. Juste pour confirmer pourquoi, expliquez:Donc, oui, un
BasicCursor
est égal à un scan de table, il n'a pas utilisé l'index. Forçons la requête à utiliser notre index clairsemé avechint()
:Et c'est le résultat que nous recherchions - seuls les documents avec le champ renseigné sont retournés. Cela utilise également uniquement l'index (c'est-à-dire qu'il s'agit d'une requête d'index couverte), donc seul l'index doit être en mémoire pour renvoyer les résultats.
Il s'agit d'un cas d'utilisation spécialisé et ne peut pas être utilisé généralement (voir les autres réponses pour ces options). En particulier, il convient de noter que dans l'état actuel des choses, vous ne pouvez pas utiliser
count()
de cette manière (pour mon exemple, il retournera 6 et non 4), veuillez donc utiliser uniquement lorsque cela est approprié.la source
Le moyen le plus simple de vérifier l'existence de la colonne dans la boussole mongo est:
la source
la requête sera
il renverra tous les documents ayant "URL IMAGE" comme clé ...........
la source
$exists
vérifie la clé"IMAGE URL"
et ne prennent pas en compte la valeur de ce (null
) et se retourner un document"IMAGE URL" : null
.