Ich habe eine node.js-Anwendung, die einige Daten abruft und in ein Objekt steckt, wie folgt:
var results = new Object();
User.findOne(query, function(err, u) {
results.userId = u._id;
}
Wenn ich ein Wenn / Dann basierend auf dieser gespeicherten ID mache, ist der Vergleich niemals wahr:
if (results.userId == AnotherMongoDocument._id) {
console.log('This is never true');
}
Wenn ich ein console.log der beiden IDs erstelle, stimmen sie genau überein:
User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002
Ich gehe davon aus, dass dies eine Art Datentypproblem ist, bin mir jedoch nicht sicher, wie die Datei results.userId in einen Datentyp konvertiert werden soll, der dazu führt, dass der obige Vergleich zutrifft und mein ausgelagertes Gehirn (auch bekannt als Google) nicht helfen konnte.
.equals()
: mongodb.github.io/node-mongodb-native/api-bson-generated/…mongoose
, können Sie nur,require('mongoose').mongo.ObjectID
damit Sie keine zusätzlichen AbhängigkeitenObjectID
s sind Objekte. Wenn Sie sie also nur mit vergleichen, vergleichen==
Sie ihre Referenzen. Wenn Sie ihre Werte vergleichen möchten, müssen Sie die folgendeObjectID.equals
Methode verwenden:quelle
Das Konvertieren der Objekt-ID in einen String (mithilfe der toString () -Methode) erledigt den Job.
quelle
Die akzeptierten Antworten schränken wirklich ein, was Sie mit Ihrem Code tun können. Beispielsweise könnten Sie kein Array von durchsuchen
Object Ids
mit der Methode equals . Stattdessen wäre es sinnvoller, die Zeichen immer in Zeichenfolgen umzuwandeln und zu vergleichen.Hier ist eine Beispielantwort für den Fall, dass Sie
indexOf()
in einem Array von Referenzen nach einer bestimmten ID suchen müssen. Angenommen, esquery
handelt sich um eine Abfrage, die Sie ausführen. Angenommen, essomeModel
handelt sich um ein Mongo-Modell für die gesuchte ID. Schließlich wird angenommen, dassresults.idList
es sich um das Feld handelt, in dem Sie nach Ihrer Objekt-ID suchen.quelle
let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
const exists = results.idList.some(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor)
oderconst exists = results.idList.some(val => val.equals(someModel._id))
Demnach habe ich drei Wege gefunden, um das Problem zu lösen.
AnotherMongoDocument._id.toString()
JSON.stringify(AnotherMongoDocument._id)
results.userId.equals(AnotherMongoDocument._id)
quelle
Ich hatte genau das gleiche Problem und löste das Problem einfach mit Hilfe von
JSON.stringify()
: -quelle
Die drei hier vorgeschlagenen möglichen Lösungen haben unterschiedliche Anwendungsfälle.
Verwenden Sie .equals, wenn Sie ObjectID für zwei MongoDocuments wie dieses vergleichen
results.userId.equals (AnotherMongoDocument._id)
Verwenden Sie .toString (), wenn Sie eine Zeichenfolgendarstellung von ObjectID mit einer ObjectID eines mongoDocument vergleichen. so was
results.userId === AnotherMongoDocument._id.toString ()
quelle