Vérifiez que le champ existe avec MongoDB

131

J'essaie donc de trouver tous les enregistrements qui ont un champ défini et qui n'est pas nul.

J'essaie d'utiliser $exists, mais selon la documentation MongoDB, cette requête renverra des champs égaux à null.

$exists correspond aux documents contenant le champ qui stocke la valeur nulle.

Donc je suppose maintenant que je vais devoir faire quelque chose comme ça:

db.collection.find({ "fieldToCheck" : { $exists : true, $not : null } })

Chaque fois que j'essaye ceci cependant, j'obtiens l'erreur [invalid use of $not] Quelqu'un a une idée de comment faire une requête pour cela?

AlbertEngelB
la source

Réponses:

184

Utiliser $ne(pour "différent de")

db.collection.find({ "fieldToCheck": { $exists: true, $ne: null } })
Sergio Tulentsev
la source
Qu'est-ce que ce retour? Une collection nulle? Un seul article? Un tableau?
Oliver Dixon
4
@iLoveUnicorns: ce findqui revient toujours: une collection d'enregistrements, correspondant aux critères.
Sergio Tulentsev
2
@SergioTulentsev AFAIK il renvoie un curseur
fernandohur
@fernandohur: oui, mais si vous avez moins d'une page de documents, vous ne verrez même pas la différence. Et si vous exécutez cette requête à partir d'un pilote externe, je suis à peu près sûr que la plupart d'entre eux vous protègent des détails d'implémentation du curseur.
Sergio Tulentsev
24

Supposons que nous ayons une collection comme ci-dessous:

{ 
  "_id":"1234"
  "open":"Yes"
  "things":{
             "paper":1234
             "bottle":"Available"
             "bottle_count":40
            } 
}

Nous voulons savoir si le champ de bouteille est présent ou non?

Ans:

db.products.find({"things.bottle":{"$exists":true}})
Pavan Choudhary
la source
2
When <boolean> is true, $exists matches the documents that contain the field, including documents where the field value is null. À partir des documents.
AlbertEngelB
1
oui, mais je ne vois pas pourquoi une base de données contiendrait la valeur null, c'est bâclé
Martijn Scheffer
3

je trouve que cela fonctionne pour moi

db.getCollection('collectionName').findOne({"fieldName" : {$ne: null}})
Manoir Yakir
la source