148 votes

Puis-je déterminer si une chaîne de caractères est un ObjectID MongoDB ?

Je fais des recherches dans MongoDB en convertissant une chaîne de caractères en BSON. Existe-t-il un moyen de déterminer si la chaîne que j'ai est un ObjectID valide pour Mongo avant d'effectuer la conversion ?

Voici le coffeescript de ma fonction findByID actuelle. Elle fonctionne très bien, mais j'aimerais pouvoir effectuer une recherche par un autre attribut si je détermine que la chaîne n'est pas un ID.

db.collection "pages", (err, collection) ->
  collection.findOne
    _id: new BSON.ObjectID(id)
  , (err, item) ->
    if item
      res.send item
    else
      res.send 404

241voto

Andy Macleod Points 1154

J'ai trouvé que le validateur ObjectId de Mongoose fonctionne pour valider les objectIds valides mais j'ai trouvé quelques cas où des ids invalides étaient considérés comme valides. (par exemple, une chaîne de 12 caractères).

var ObjectId = require('mongoose').Types.ObjectId;
ObjectId.isValid('microsoft123'); //true
ObjectId.isValid('timtomtamted'); //true
ObjectId.isValid('551137c2f9e1fac808a5f572'); //true

Ce qui fonctionne pour moi, c'est de transformer une chaîne en un objectId, puis de vérifier que la chaîne originale correspond à la valeur de l'objectId.

new ObjectId('timtamtomted'); //616273656e6365576f726b73
new ObjectId('537eed02ed345b2e039652d2') //537eed02ed345b2e039652d2

Cela fonctionne parce que les identifiants valides ne changent pas lorsqu'ils sont convertis en un ObjectId, mais une chaîne de caractères qui obtient un false valid changera lorsqu'elle sera convertie en un objectId.

114voto

Someone Special Points 593

✅ Build In Solution isValidObjectId() > Mongoose 5.7.12

Si vous utilisez Mongoose, nous pouvons tester si une chaîne est de 12 octets ou une chaîne de 24 caractères hexagonaux en utilisant mongoose build-in isValidObjectId .

mongoose.isValidObjectId(string); /* will return true/false */

103voto

JohnnyHK Points 61191

Vous pouvez utiliser une expression régulière pour le vérifier :

CoffeeScript

if id.match /^[0-9a-fA-F]{24}$/
    # it's an ObjectID
else
    # nope

JavaScript

if (id.match(/^[0-9a-fA-F]{24}$/)) {
    // it's an ObjectID    
} else {
    // nope    
}

20voto

cbaigorri Points 609

J'ai utilisé le pilote natif de node mongodb pour le faire dans le passé. La méthode isValid vérifie que la valeur est un BSON ObjectId valide. Voir la documentation ici.

var ObjectID = require('mongodb').ObjectID;
console.log( ObjectID.isValid(12345) );

6voto

Sajag Porwal Points 71

Mongoose.Types.ObjectId.isValid(string) renvoie toujours True si la chaîne contient 12 lettres.

let firstUserID = '5b360fdea392d731829ded18';
let secondUserID = 'aaaaaaaaaaaa';

console.log(mongoose.Types.ObjectId.isValid(firstUserID)); // true
console.log(mongoose.Types.ObjectId.isValid(secondUserID)); // true

let checkForValidMongoDbID = new RegExp("^[0-9a-fA-F]{24}$");
console.log(checkForValidMongoDbID.test(firstUserID)); // true
console.log(checkForValidMongoDbID.test(secondUserID)); // 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