La méthode MongoDB findOne est très efficace pour la recherche au sein d’une col­lec­tion. Cependant, elle ne renvoie qu’un seul résultat à la fois : elle ne convient donc pas à tous les besoins.

Qu’est-ce que MongoDB findOne ?

MongoDB est un système de gestion de base de données qui, grâce à son approche NoSQLet à sa grande évo­lu­ti­vité, peut fa­ci­le­ment stocker et gérer de grandes quantités de données. C’est certes un grand avantage, mais cela nécessite des méthodes solides pour que les uti­li­sa­teurs gardent une vue d’ensemble lors du travail avec la base de données.

Le système en­re­gistre les données de tous types sous la forme d’un document BSON (Binary JSON) et regroupe ces documents en col­lec­tions. Si vous souhaitez re­cher­cher et éditer l’un de ces documents, vous avez plusieurs pos­si­bi­li­tés. Outre la méthode plus générale MongoDB find, MongoDB findOne est une méthode très efficace pour filtrer de manière ciblée même les bases de données vo­lu­mi­neuses.

MongoDB findOne recherche tous les documents et col­lec­tions pris en compte selon certains critères qui peuvent être spécifiés par l’uti­li­sa­teur. La par­ti­cu­la­rité de cette méthode est qu’elle ne renvoie qu’un seul document cor­res­pon­dant aux pa­ra­mètres définis. S’il n’y a qu’un seul document qui apparaît dans la demande de recherche, celui-ci est pris en compte. Si plusieurs documents entrent en ligne de compte, MongoDB findOne affiche le document qui apparaît en premier dans l’ordre naturel de la base de données. Si aucun document ne peut être trouvé lors de la recherche, le résultat est « zéro ».

Syntaxe et par­ti­cu­la­ri­tés de MongoDB findOne

La syntaxe de base de MongoDB findOne est très claire. La méthode est toujours appliquée de la manière suivante :

db.collection.findOne ( <query>, <projection>, <options> )
shell

Sous <query>, on indique les pa­ra­mètres de recherche selon lesquels la méthode doit filtrer les documents. Cette entrée est fa­cul­ta­tive. Les entrées sous <projection> dé­ter­mi­nent quels champs sont pris en compte pour le document affiché. Les valeurs au­to­ri­sées pour la sortie sont les valeurs boo­léennes 1 (res­pec­ti­ve­ment vrai) et 0 (res­pec­ti­ve­ment faux). Si cette in­di­ca­tion reste vide, tous les champs sont toujours affichés. Elle est donc également fa­cul­ta­tive. <options> permet de modifier la recherche et de changer l’affichage.

Note

Pour effectuer des re­cherches efficaces dans les col­lec­tions avec plusieurs pa­ra­mètres de recherche, il existe MongoDB Queries, que nous ex­pli­que­rons plus en détail dans un autre article. Les requêtes sont basées sur la commande MongoDB find.

Créer une col­lec­tion à des fins de test

Si vous avez installé MongoDB sous Linux, Windows ou Mac et que vous souhaitez utiliser MongoDB findOne pour vous-même, il vaut la peine de créer d’abord un en­vi­ron­ne­ment de test pour la première uti­li­sa­tion de la méthode. Nous vous montrons les premiers pas avec la base de données dans notre tutoriel MongoDB très complet. Pour notre exemple, nous nous imaginons une base de données d’employés qui contient cinq entrées et des in­for­ma­tions sur le nom, le sexe et l’âge de l’employé. Il y a également une in­for­ma­tion sur la date d’entrée de la personne dans l’en­tre­prise. Cette col­lec­tion se présente par exemple comme suit :

# Create Collection
db.collaborateurs.insertMany ( [
    {
    name : "Martin",
    gender : "Female",
    age : 56,
    year : 2002
    },
    {
    name : "Lejeune",
    gender : "Female",
    age : 40,
    year : 2017,
    },
    {
    name : "Foucault",
    gender : "Male",
    age : 40,
    year : 2019
    },
    {
    name : "Arslan",
    gender : "Female",
    age : 44,
    year : 2015
    },
    name : "Jacob",
    gender : "Male",
    age : 22,
    year : 2022
    }
]
)
shell

MongoDB findOne : recherche sans pa­ra­mètres

Si vous appliquez dans cet exemple la méthode MongoDB findOne sans aucun paramètre, le système va re­cher­cher dans votre base de données et trouver cinq entrées qu’il doit prendre en compte. Comme aucun document n’est exclu, les cinq col­la­bo­ra­teurs et col­la­bo­ra­trices entrent en ligne de compte. En con­sé­quence, MongoDB findOne sé­lec­tion­ne­rait la première personne qui a été saisie dans la base de données, car la méthode ne joue qu’un seul résultat à la fois. Voici le résultat pour notre exemple :

db.collaborateurs.findOne ( )
shell

Voici la sortie cor­res­pon­dante :

db.collaborateurs.findOne ( )
{
    _id : ObjectID ( "529ete7300of4002bme148om" ),
    name : "Martin",
    gender : "Female",
    age : 56,
    year : 2002
}
shell

Re­cher­cher des entrées par ID

MongoDB findOne propose les outils adéquats pour effectuer une recherche spé­ci­fique afin de trouver exac­te­ment le document dont vous avez besoin. Une méthode très sûre est la recherche par ID. Le champ _id est unique dans chaque document et peut donc toujours être attribué exac­te­ment à un col­la­bo­ra­teur, dans le cas de notre exemple. Si vous exécutez MongoDB findOne via l’ID de l’objet, vous ob­tien­drez le résultat exact. Voici une mise en situation avec notre exemple précédent :

db.collaborateurs.findOne ( { _id : ObjectID ( "582pfh773813tw982qj411l0" ) } )
shell

La sortie devrait alors être la suivante :

db.collaborateurs.findOne ( { _id : ObjectID ( "582pfh773813tw982qj411l0" ) } )
{
    _id : ObjectID ( "582pfh773813tw982qj411l0"
    name : "Jacob",
    gender : "Male",
    age : 22,
    year : 2022
}
shell

Re­cher­cher des champs spé­ci­fiques avec MongoDB findOne

Si vous ne con­nais­sez pas l’ID ou si vous souhaitez re­cher­cher d’autres pa­ra­mètres dans votre col­lec­tion, vous pouvez également re­cher­cher des champs spéciaux avec MongoDB findOne. Ici aussi, s’il n’y a qu’un seul document cor­res­pon­dant au paramètre, c’est lui qui sera affiché. Toutefois, si plusieurs documents cor­res­pon­dent à vos critères de recherche, le système n’affichera que la première entrée. Dans notre exemple, nous re­cher­chons donc toutes les entrées dont le sexe est « Male » (homme). En théorie, la sortie serait composée de deux résultats. Mais seul le premier sera affiché. Voici comment fonc­tionne la commande cor­res­pon­dante :

db.collaborateurs.findOne ( { gender : "Male" } )
shell

La sortie montre alors l’employé M. Foucault :

db.collaborateurs.findOne ( { gender : "Male" } )
{
    _id : ObjectID ( "498p0t173mv489fh63th00kh"
    name : "Foucault",
    gender : "Male",
    age : 40,
    year : 2019
}
shell

MongoDB findOne : spécifier la recherche

Bien sûr, vous avez aussi la pos­si­bi­lité de limiter votre recherche pour éviter tout che­vau­che­ment. Dans notre petite col­lec­tion d’exemples, ce n’est pas forcément né­ces­saire, mais si vous tra­vail­lez avec plusieurs centaines ou milliers d’entrées, vous ap­pré­cie­rez cette option. MongoDB findOne vous permet d’utiliser plusieurs champs pour la recherche. Voici à quoi cela ressemble si vous souhaitez iden­ti­fier un employé en fonction de son sexe (homme) et de son âge :

db.collaborateurs.findOne ( { gender : "Male", age: 40 } )
shell

La sortie montre alors à nouveau M. Foucault, qui est la seule personne de la col­lec­tion à être un homme et à avoir 40 ans. L’employée Mme Lejeune aurait certes eu le même âge, mais elle est de sexe féminin.

db.collaborateurs.findOne ( { gender : "Male", age: 40 } )
{
    _id : ObjectID ( "498p0t173mv489fh63th00kh"
    name : "Foucault",
    gender : "Male",
    age : 40
    year : 2019
}
shell

Définir des con­di­tions pour un champ

Il est également possible de définir des con­di­tions pour un champ spé­ci­fique et de les appliquer comme critère de recherche. Dans l’exemple suivant, nous ne prenons en compte que les personnes âgées de plus de 30 ans.

Voici la saisie :

db.collaborateurs.findOne ( { age : { $gt : 30 } } )
shell

Ainsi, le col­la­bo­ra­teur M. Jacob est exclu. Comme Mme Martin cor­res­pond au critère et qu’elle est la première personne de la liste, elle est à nouveau affichée :

db.collaborateurs.findOne ( { age : { $gt : 30 } } )
{
    _id : ObjectID ( "529ete7300of4002bme148om" ),
    name : "Foucault",
    gender : "Female",
    age : 56,
    year : 2002
}
shell

Exclure des champs avec MongoDB findOne

C’est surtout dans le cas de col­lec­tions étendues, qui con­tien­nent en plus beaucoup d’in­for­ma­tions, que la sortie peut devenir confuse. C’est pourquoi MongoDB findOne offre la pos­si­bi­lité d’exclure des champs in­di­vi­duels pour la sortie. Dans l’exemple suivant, nous sou­hai­tons que l’ID, le sexe et l’âge ne soient pas affichés.

db.collaborateurs.findOne ( { name : "Martin" }, { _id : 0, gender : 0, age : 0 } )
shell

Comme toutes les autres données sont affichées, vous obtenez la sortie suivante :

db.collaborateurs.findOne ( {name : "Martin" }, { _id : 0, gender : 0, age : 0 } )
{
    name : "Martin",
    year : 2002
}
shell

Exemple de recherche in­fruc­tueuse

S’il n’y a pas de résultats pour votre recherche avec MongoDB findOne, cela vous sera indiqué. Nous re­cher­chons donc la col­la­bo­ra­trice Ferrier qui n’est pas men­tion­née dans la col­lec­tion.

db.collaborateurs.findOne ( { name : "Ferrier" } )
shell

La sortie est alors la suivante :

db.collaborateurs.findOne ( { name : "Ferrier" } )
null
shell
Conseil

Pour gérer plus fa­ci­le­ment votre base de données, il existe une interface graphique gratuite MongoDB Compass, que nous pré­sen­te­rons dans un autre article.

Aller au menu principal