web-dev-qa-db-fra.com

Comparaison de la mangouste _id et des chaînes

J'ai une application node.js qui extrait des données et les colle dans un objet, comme ceci:

var results = new Object();

User.findOne(query, function(err, u) {
    results.userId = u._id;
}

Lorsque je fais un if/then en fonction de cet ID stocké, la comparaison n'est jamais vraie:

if (results.userId == AnotherMongoDocument._id) {
    console.log('This is never true');
}

Quand je fais un fichier console.log des deux identifiants, ils correspondent exactement:

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002

Je suppose qu'il s'agit d'un problème de type de données, mais je ne suis pas sûr de savoir comment convertir results.userId en un type de données qui aboutira à la comparaison ci-dessus et à mon cerveau externalisé (Google) n'a pas été en mesure de vous aider.

168
pat

Mongoose utilise le pilote mongodb-native, qui utilise le type ObjectID personnalisé. Vous pouvez comparer les ObjectID avec la méthode .equals(). Avec votre exemple, results.userId.equals(AnotherMongoDocument._id). Le type ObjectID a également une méthode toString(), si vous souhaitez stocker une version sous forme de chaîne de ObjectID au format JSON ou un cookie.

Si vous utilisez ObjectID = require("mongodb").ObjectID (nécessite la bibliothèque mongodb-native), vous pouvez vérifier si results.userId est un identifiant valide avec results.userId instanceof ObjectID.

Etc.

305
cjohn

ObjectIDs sont des objets, donc si vous ne faites que les comparer avec ==, vous comparez leurs références. Si vous voulez comparer leurs valeurs, vous devez utiliser la méthode ObjectID.equals:

if (results.userId.equals(AnotherMongoDocument._id)) {
    ...
}
56
JohnnyHK

convertir l’identifiant d’objet en chaîne (en utilisant la méthode toString ()) fera le travail.

15
Dila Gurung

Les réponses acceptées limitent réellement ce que vous pouvez faire avec votre code. Par exemple, vous ne pourrez pas rechercher un tableau de Object Ids en utilisant la méthode equals. Au lieu de cela, il serait plus logique de toujours convertir en chaîne et de comparer les clés.

Voici un exemple de réponse si vous devez utiliser indexOf() pour rechercher dans un tableau de références un identifiant spécifique. suppose que query est une requête que vous exécutez, supposez que someModel est un modèle Mongo correspondant à l'identifiant que vous recherchez et, enfin, supposez que results.idList correspond au champ dans lequel vous recherchez votre identifiant d'objet .

query.exec(function(err,results){
   var array = results.idList.map(function(v){ return v.toString(); });
   var exists = array.indexOf(someModel._id.toString()) >= 0;
   console.log(exists);
});
8
r3wt

D'après ce qui précède, j'ai trouvé trois façons de résoudre le problème.

  1. AnotherMongoDocument._id.toString()
  2. JSON.stringify(AnotherMongoDocument._id)
  3. results.userId.equals(AnotherMongoDocument._id)
2
joy

J'ai fait face exactement au même problème et j'ai simplement résolu le problème avec l'aide de JSON.stringify() comme suit: -

if (JSON.stringify(results.userId) === JSON.stringify(AnotherMongoDocument._id)) {
        console.log('This is never true');
}
0
Jitendra