Mam aplikację node.js, która pobiera niektóre dane i umieszcza je w obiekcie, na przykład:
var results = new Object();
User.findOne(query, function(err, u) {
results.userId = u._id;
}
Kiedy wykonuję if / then na podstawie tego przechowywanego identyfikatora, porównanie nigdy nie jest prawdziwe:
if (results.userId == AnotherMongoDocument._id) {
console.log('This is never true');
}
Kiedy robię plik console.log dwóch identyfikatorów, pasują one dokładnie:
User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002
Zakładam, że jest to jakiś problem z typem danych, ale nie jestem pewien, jak przekonwertować results.userId na typ danych, który spowoduje, że powyższe porównanie będzie prawdziwe, a mój outsourcing mózgu (alias Google) nie był w stanie pomóc.
.equals()
: mongodb.github.io/node-mongodb-native/api-bson-generated/…mongoose
, możesz po prosturequire('mongoose').mongo.ObjectID
nie wymieniać żadnych dodatkowych zależnościObjectID
s są obiektami, więc po prostu porównując je==
, porównujesz ich odwołania. Jeśli chcesz porównać ich wartości, musisz użyćObjectID.equals
metody:źródło
konwersja id obiektu na ciąg (przy użyciu metody toString ()) wykona zadanie.
źródło
Akceptowane odpowiedzi naprawdę ograniczają możliwości kodu. Na przykład nie można przeszukiwać tablicy
Object Ids
za pomocą metody równości. Zamiast tego bardziej sensowne byłoby zawsze rzutowanie na łańcuch i porównywanie kluczy.Oto przykładowa odpowiedź na wypadek, gdybyś musiał użyć,
indexOf()
aby sprawdzić w tablicy referencji określonego identyfikatora. załóżmy, żequery
wykonujesz zapytanie, załóżmy, żesomeModel
jest to model mongo dla identyfikatora, którego szukasz, i na koniec załóż, żeresults.idList
jest to pole, w którym szukasz identyfikatora obiektu.źródło
let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
const exists = results.idList.some(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor)
lubconst exists = results.idList.some(val => val.equals(someModel._id))
Zgodnie z powyższym znalazłem trzy sposoby rozwiązania problemu.
AnotherMongoDocument._id.toString()
JSON.stringify(AnotherMongoDocument._id)
results.userId.equals(AnotherMongoDocument._id)
źródło
Napotkałem dokładnie ten sam problem i po prostu go rozwiązałem za pomocą
JSON.stringify()
:źródło
Trzy sugerowane tutaj możliwe rozwiązania mają różne przypadki użycia.
Użyj .equals podczas porównywania ObjectID na dwóch takich dokumentach mongoDocuments
results.userId.equals (AnotherMongoDocument._id)
Użyj .toString () podczas porównywania reprezentacji ciągu ObjectID z ObjectID obiektu mongoDocument. lubię to
results.userId === AnotherMongoDocument._id.toString ()
źródło