У меня есть приложение node.js, которое извлекает некоторые данные и вставляет их в объект, например так:
var results = new Object();
User.findOne(query, function(err, u) {
results.userId = u._id;
}
Когда я делаю if / then на основе этого сохраненного идентификатора, сравнение никогда не выполняется:
if (results.userId == AnotherMongoDocument._id) {
console.log('This is never true');
}
Когда я делаю console.log двух идентификаторов, они точно совпадают:
User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002
Я предполагаю, что это какая-то проблема с типом данных, но я не уверен, как преобразовать results.userId в тип данных, который приведет к тому, что приведенное выше сравнение будет истинным, и мой внешний мозг (он же Google) не сможет помочь.
.equals()
: mongodb.github.io/node-mongodb-native/api-bson-generated/…mongoose
то можете простоrequire('mongoose').mongo.ObjectID
неObjectID
Это объекты, поэтому, если вы просто сравните их со==
своими ссылками. Если вы хотите сравнить их значения, вам нужно использоватьObjectID.equals
метод:источник
Преобразование идентификатора объекта в строку (с помощью метода toString ()) сделает работу.
источник
Принятые ответы действительно ограничивают то, что вы можете сделать со своим кодом. Например, вы не сможете найти массив
Object Ids
с помощью метода equals. Вместо этого было бы разумнее всегда приводить к строке и сравнивать ключи.Вот пример ответа в случае, если вам нужно использовать
indexOf()
для проверки в массиве ссылок для конкретного идентификатора. предположимquery
, что вы выполняете запрос, предположите, чтоsomeModel
это модель Монго для идентификатора, который вы ищете, и, наконец, предположите,results.idList
что это поле, в котором вы ищете свой идентификатор объекта.источник
let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
const exists = results.idList.some(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor)
илиconst exists = results.idList.some(val => val.equals(someModel._id))
Исходя из вышеизложенного, я нашел три способа решения проблемы.
AnotherMongoDocument._id.toString()
JSON.stringify(AnotherMongoDocument._id)
results.userId.equals(AnotherMongoDocument._id)
источник
Я столкнулся с точно такой же проблемой, и я просто решил проблему с помощью
JSON.stringify()
следующего: -источник
Предлагаемые здесь три возможных решения имеют разные варианты использования.
Используйте .equals при сравнении ObjectID на двух mongoDocuments, как это
results.userId.equals (AnotherMongoDocument._id)
Используйте .toString () при сравнении строкового представления ObjectID с ObjectID mongoDocument. как это
results.userId === AnotherMongoDocument._id.toString ()
источник