web-dev-qa-db-fra.com

Sélectionnez les documents MongoDB dans lesquels un champ n'existe pas, est nul ou faux?

Supposons que j'ai une collection qui contient les documents suivants:

{ "_id": 1, name: "Apple" }
{ "_id": 2, name: "Banana", "is_reported": null }
{ "_id": 3, name: "Cherry", "is_reported": false }
{ "_id": 4, name: "Kiwi",   "is_reported": true }

Existe-t-il une requête plus simple pour sélectionner tous les documents où "is_reported" est dans un état falsifié; c'est-à-dire inexistant, nul ou faux? Autrement dit, une requête qui sélectionne Apple, Banana et Cherry, mais pas Kiwi?

Selon la FAQ MongoDB , { "is_reported": null } sélectionnera les documents où "is_reported" est nul ou inexistant, mais il ne sélectionne toujours pas les documents où "is_reported" est faux.

En ce moment, j'ai la requête suivante, qui fonctionne bien, mais elle ne semble tout simplement pas très élégante. S'il y a plusieurs champs que je dois sélectionner, cela devient très rapidement désordonné. Existe-t-il une meilleure requête qui atteint le même résultat final?

db.fruits.find({ $or: [ { "is_reported": null }, { "is_reported": false } ] })
37
sffc

Vous pouvez le faire avec $in :

db.fruits.find({is_reported: {$in: [null, false]}})

retour:

{
  "_id": 1,
  "name": "Apple"
}
{
  "_id": 2,
  "name": "Banana",
  "is_reported": null
}
{
  "_id": 3,
  "name": "Cherry",
  "is_reported": false
}

Vous pouvez également inverser les choses de manière logique et utiliser $ne si vous n'avez aucune valeur en plus de true à exclure:

db.fruits.find({is_reported: {$ne: true}})
91
JohnnyHK