web-dev-qa-db-fra.com

Comment interroger MongoDB pour tester si un élément existe?

MongoDB propose-t-il une méthode de recherche ou une méthode de requête permettant de tester l'existence d'un élément en fonction d'une valeur de champ? Nous voulons simplement vérifier l'existence, et ne pas renvoyer le contenu complet de l'élément.

29
user646584

Je ne crois pas qu'il existe un moyen simple de vérifier l'existence de l'élément par sa valeur. Mais vous pouvez le faire en récupérant seulement id ( avec la sélection du champ )

db.your_collection.find({..criteria..}, {"_id" : 1});
22
RameshVel

Comme vous n'avez pas besoin du nombre, vous devez vous assurer que la requête reviendra après avoir trouvé la première correspondance. Puisque compter les performances n’est pas idéal , c’est plutôt important. La requête suivante devrait accomplir cela:

db.Collection.find({ /* criteria */}).limit(1).size();

Notez que find().count() par défaut not respecte la clause limit et peut donc renvoyer des résultats inattendus (et essayera de trouver toutes les correspondances). size() ou count(true) respectera le drapeau de limite.

Si vous voulez aller aux extrêmes, vous devez vous assurer que votre requête utilise index couverts . Les index couverts accèdent uniquement à l'index, mais ils nécessitent que le champ sur lequel vous interrogez soit indexé. En général, cela devrait le faire car un count() ne renvoie évidemment aucun champ. Néanmoins, les index couverts ont parfois besoin de curseurs plutôt verbeux:

db.values.find({"value" : 3553}, {"_id": 0, "value" : 1}).limit(1).explain();

{
  // ...
  "cursor" : "BtreeCursor value_1",
  "indexOnly" : true,  // covered!
}

Malheureusement, count() n'offre pas explain(), il est donc difficile de dire si cela en vaut la peine. Comme d'habitude, la mesure est un meilleur compagnon que la théorie, mais la théorie peut au moins vous éviter des problèmes plus importants.

49
mnemosyn

Starting Mongo 2.6, count a un paramètre optionnel limit, ce qui en fait une alternative viable pour rechercher l'existence d'un document ou non:

db.collection.count({}, { limit: 1 })
// returns 1 if exists and 0 otherwise

ou avec une requête de filtrage:

db.collection.count({/* criteria */}, { limit: 1 })

En limitant le nombre d'occurrences correspondantes, l'analyse de la collection s'arrête chaque fois qu'une correspondance est trouvée au lieu de parcourir l'intégralité de la collection.


Démarrage de Mongo 4.0.3, puisque count() est considéré comme obsolète nous pouvons utiliser countDocuments à la place:

db.collection.countDocuments({}, { limit: 1 })

ou avec une requête de filtrage:

db.collection.countDocuments({/* criteria */}, { limit: 1 })
5
Xavier Guihot

J'ai simplement utilisé lodash framework - _isEmpty ();

const {MongoClient, ObjectId} = require ('mongodb'); const _ = require ('lodash');

MongoClient.connect (testURL, {useNewUrlParser: true}, (err, client) => { Let db = client.db ('monentreprise');

if (err) {
console.log('unable to connect to the mycompany database');
} else {
console.log('test connection to the database');
};

db.collection('employee').find({name:    'Test User'}).toArray((err, result) => {

    if (err) {
        console.log('The search errored');
    } else if (_.isEmpty(result)) {
        console.log('record not found')
    } else {
        console.log(result);
    };
});

client.close ();

});

0
ufookoro