145 votes

MongoDB : Comment rechercher des enregistrements dont le champ est nul ou non défini ?

J'ai un Email qui possède un sent_at champ de la date :

{
  'sent_at': Date( 1336776254000 )
}

Si cette Email n'a pas été envoyé, le sent_at est soit nul, soit inexistant.

J'ai besoin de connaître le nombre d'envois et de non-envois. Emails . J'ai du mal à trouver la bonne façon de demander ces informations. Je pense que c'est la bonne façon d'obtenir le nombre d'envois :

db.emails.count({sent_at: {$ne: null}})

Mais comment puis-je obtenir le décompte de ceux qui n'ont pas été envoyés ?

242voto

jdi Points 38029

Si le sent_at Le champ n'est pas présent lorsqu'il n'est pas activé :

db.emails.count({sent_at: {$exists: false}})

S'il est là et nul, ou pas du tout :

db.emails.count({sent_at: null})

S'il est présent et nul :

db.emails.count({sent_at: { $type: 10 }})

En Recherche de champs nuls ou manquants du manuel MongoDB décrit comment interroger les valeurs nulles et manquantes.

Filtre d'égalité

En { item : null } La requête correspond aux documents qui contiennent le champ item dont la valeur est null ou qui ne contiennent pas l'élément item domaine.

db.inventory.find( { item: null } )

Contrôle d'existence

L'exemple suivant recherche les documents qui ne contiennent pas de champ.

En { item : { $exists: false } } La requête correspond aux documents qui ne contiennent pas l'élément item domaine :

db.inventory.find( { item : { $exists: false } } )

Type de contrôle

En { item : { $type: 10 } } correspondances de la requête seulement les documents qui contiennent les item dont la valeur est null ; c'est-à-dire que la valeur du champ item est de Type de BSON Null (numéro de type 10 ) :

db.inventory.find( { item : { $type: 10 } } )

22voto

tvs Points 371

Si vous voulez compter UNIQUEMENT les documents avec sent_at défini avec une valeur de null (ne pas compter les documents avec sent_at n'est pas défini) :

db.emails.count({sent_at: { $type: 10 }})

16voto

Anil Tallam Points 301

Utiliser :

db.emails.count({sent_at: null})

Qui comptabilise tous les courriels dont la propriété sent_at est nulle ou n'est pas définie. La requête ci-dessus est identique à la suivante.

db.emails.count({$or: [
  {sent_at: {$exists: false}},
  {sent_at: null}
]})

10voto

Jim Horng Points 117

Il semble que l'on puisse se contenter d'une seule ligne :

{ "sent_at": null }

4voto

Shashank Agrawal Points 14533

Toutes les réponses ci-dessus sont étonnantes et correctes. Je voudrais juste ajouter une amélioration aux réponses, à savoir l'utilisation de $type .

Démarrer avec MongoDB 3.2 vous pouvez éviter d'utiliser 10 (car les valeurs littérales codées en dur réduisent la lisibilité du code) et peuvent simplement utiliser des alias de chaînes de caractères, c'est-à-dire "null" . En résumé

1. Si vous souhaitez sélectionner des enregistrements où sent_at existe et a la valeur null

db.emails.count({sent_at: { $type: 'null' }});

// or
// This reduces the code readability as your peer might not know
// that what is the meaning of value 10
db.emails.count({sent_at: { $type: 10 }});

2. Si vous souhaitez sélectionner des enregistrements qui ont soit sent_at: null o sent_at n'existe pas

// This will ensure both the conditions
db.emails.count({ sent_at: null })

3. Si vous ne voulez que les enregistrements où sent_at n'existe pas

db.emails.count({sent_at: { $exists: false }});

4. Si vous voulez seulement choisir sent_at où le champ existe et peut avoir n'importe quelle valeur

db.emails.count({sent_at: { $exists: true }});

N'oubliez pas que cette opération permet d'extraire n'importe quel document de la base de données emails qui a une valeur quelconque, y compris null , 0 , '' , false .

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