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

4voto

Pavneet Kaur Points 11

La manière la plus simple de vérifier si la chaîne est un ObjectId Mongo valide est d'utiliser mongodb module.

const ObjectID = require('mongodb').ObjectID;

if(ObjectID.isValid(777777777777777)){
   console.log("Valid ObjectID")
}

3voto

AliAvci Points 692

Ci-dessous une fonction qui vérifie les deux avec l'ObjectId isValid et si oui ou non new ObjectId(id) renvoie la même valeur. La raison pour laquelle isValid Le fait de ne pas être assez seul est très bien décrit par Andy Macleod dans la réponse choisie.

const ObjectId = require('mongoose').Types.ObjectId;

/**
 * True if provided object ID valid
 * @param {string} id 
 */
function isObjectIdValid(id){ 
  return ObjectId.isValid(id) && new ObjectId(id) == id;
}

3voto

Fraction Points 1746

Introduction de Mongoose 6.2.5 mongoose.isObjectIdOrHexString() qui renvoie true seulement si la valeur donnée est un ObjectId ou une chaîne hexagonale de 24 caractères représentant une instance ObjectId et reviendra false pour les nombres, les documents et les chaînes de caractères de longueur 12 (contrairement à mongoose.isValidObjectId() qui est juste une enveloppe pour mongoose.Types.ObjectId.isValid() dans Mongoose 6)

Mongoose.prototype.isObjectIdOrHexString()

Paramètres

  • v "Tout"

Renvoie true si la valeur donnée est un Mongoose ObjectId (en utilisant instanceof) ou si la valeur donnée est une chaîne hexagonale de 24 caractères, qui est la représentation de chaîne la plus couramment utilisée d'un ObjectId.

Cette fonction est similaire à isValidObjectId(), mais considérablement plus stricte, car isValidObjectId() retournera vrai pour toute valeur que Mongoose peut convertir en ObjectId. Cela inclut les documents Mongoose, toute chaîne de longueur 12, et tout nombre. isObjectIdOrHexString() renvoie true uniquement pour les instances ObjectId ou les chaînes hexagonales de 24 caractères, et renvoie false pour les nombres, les documents, et les chaînes de longueur 12.

Exemple :

mongoose.isObjectIdOrHexString(new mongoose.Types.ObjectId()); // true
mongoose.isObjectIdOrHexString('62261a65d66c6be0a63c051f'); // true

mongoose.isObjectIdOrHexString('0123456789ab'); // false
mongoose.isObjectIdOrHexString(6); // false
mongoose.isObjectIdOrHexString(new User({ name: 'test' })); // false
mongoose.isObjectIdOrHexString({ test: 42 }); // false

2voto

nzjoel Points 138

Voici un peu de code que j'ai écrit sur la base de la réponse de @andy-macleod.

Il peut prendre soit un int, soit une chaîne de caractères ou un ObjectId et renvoie un ObjectId valide si la valeur passée est valide ou null si elle est invalide :

var ObjectId= require('mongoose').Types.ObjectId;

function toObjectId(id) {

    var stringId = id.toString().toLowerCase();

    if (!ObjectId.isValid(stringId)) {
        return null;
    }

    var result = new ObjectId(stringId);
    if (result.toString() != stringId) {
        return null;
    }

    return result;
}

2voto

Daphoque Points 1862

Le seul moyen que j'ai trouvé est de créer un nouvel ObjectId avec la valeur que je veux vérifier, si l'entrée est égale à la sortie, l'id est valide :

function validate(id) {
    var valid = false;
    try
    {
        if(id == new mongoose.Types.ObjectId(""+id))
           valid = true;

    }
    catch(e)
    {
       valid = false;
    }
    return valid;
}

> validate(null)
false
> validate(20)
false
> validate("abcdef")
false
> validate("5ad72b594c897c7c38b2bf71")
true

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