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

0voto

Om Sharma Points 369

Pour la mangouste, utilisez la fonction isValid() pour vérifier si l'objectId est valide ou non.

Exemple :

var ObjectId = mongoose.Types.ObjectId;
if(ObjectId.isValid(req.params.documentId)){
   console.log('Object id is valid'); 
}else{
   console.log('Invalid Object id');
}

0voto

ross-u Points 59

Ajoutant à la réponse acceptée d'Andy Macleod, j'ai créé une fonction d'aide qui peut être utilisée pour vérifier à la fois les chaînes de caractères et les ObjectId.

Implantation :

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

function isValidObjectId(value) {
  // If value is an ObjectId cast it to a string to allow
  // passing string or ObjectId as an argument.
  var valueString = typeof value === "string" ? value : String(value); 

  // Cast the string to ObjectId
  var idInstance = new ObjectId(valueString); 

  return String(idInstance) === valueString;
}

Explication :

Dans la réponse acceptée Andy Macleod a dit :

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

Avec la chaîne Invalid ObjectId

Transformation d'une chaîne invalide (comme "microsoft" ) à ObjectId, donne une valeur complètement différente :

        "microsoft"
            ↓
String( new ObjectId("microsoft")  );
            ↓
"6d6963726f736f6674313233"
            ↓
"microsoft" === "6d6963726f736f6674313233" // false

Avec une chaîne ObjectId valide

La conversion d'une chaîne valide comme ( "6d6963726f736f6674313233" ) à ObjectId, donne la même valeur :

"6d6963726f736f6674313233"
            ↓
String( new ObjectId("6d6963726f736f6674313233") )
            ↓
"6d6963726f736f6674313233"     
            ↓
"6d6963726f736f6674313233" === "6d6963726f736f6674313233"  // true

0voto

comandantexd Points 33

https://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html#objectid-isvalid

Extrait de la documentation de MongoDB :

Documentation du constructeur :

ObjectID()
Constructor
Create a new ObjectID instance

class ObjectID()
    Arguments:  
        id (string) – Can be a 24 byte hex string, 12 byte binary string or a Number.
    Returns:    
        object instance of ObjectID.

Documentation sur ObjectId.isValid() :

Checks if a value is a valid bson ObjectId

ObjectID.isValid()
    Returns:    boolean return true if the value is a valid bson ObjectId, return false otherwise.

Donc, isValid(...) retournera vrai si l'argument est un objet BSON ObjectId valide, et le constructeur ObjectId(...) n'accepte qu'un argument objet BSON ObjectId valide (fondamentalement, isValid(...) retournera false si une exception est levée par le constructeur).

Sachant cela. Nous pouvons d'abord vérifier si l'argument est valide ObjectId puis créez un ObjectId avec cette valeur et comparer les chaînes HEX.

const objectId = 'str_object_id';
const isValid = ObjectId.isValid(objectId) && new ObjectId(objectId).toHexString() == objectId;

Si elle est adoptée objectId n'est pas un ObjectId Chaîne HEX (elle n'a pas été convertie par le constructeur), cette méthode retournera false.

-3voto

iss42 Points 169

Attention : isValid retournera vrai pour des chaînes arbitraires de longueur 12/24 commençant par un chiffre hexagonal valide. Actuellement, je pense que c'est une meilleure vérification :

((thing.length === 24 || thing.length === 12) && isNaN(parseInt(thing,16)) !== 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