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.
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.
ObjectID
s 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)) {
...
}
convertir l’identifiant d’objet en chaîne (en utilisant la méthode toString ()) fera le travail.
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);
});
D'après ce qui précède, j'ai trouvé trois façons de résoudre le problème.
AnotherMongoDocument._id.toString()
JSON.stringify(AnotherMongoDocument._id)
results.userId.equals(AnotherMongoDocument._id)
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');
}