Сравнение mongoose _id и строк
У меня есть приложение 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 двух идентификаторов, они точно соответствуют:
- Любой способ заставить строгий режим в узле?
- 2013 Meteor NPM Packages
- пакет локальной установки npm для настраиваемого местоположения
- Как сделать сервер webpack dev запущенным на порту 80 и 0.0.0.0, чтобы сделать его общедоступным?
- Как вы превращаете документ Mongoose в простой объект?
User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002
Я предполагаю, что это какая-то проблема с типами данных, но я не уверен, как преобразовать results.userId в тип данных, который приведет к тому, что приведенное выше сравнение будет истинным, и мой внешний мозг (он же Google) не смог бы помочь.
- connect ECONNREFUSED - узел js, sql
- Отправка электронной почты в Node.js?
- node-mysql несколько операторов в одном запросе
- Node.js - найти домашнюю директорию в агностическом режиме платформы
- Как искать в массиве объекта в mongodb
- Облачные функции Firebase очень медленные
- Что такое хороший магазин сеансов для одноразового приложения Node.js?
- res.redirect from POST
Mongoose использует собственный драйвер mongodb, который использует настраиваемый тип ObjectID. Вы можете сравнить ObjectID с .equals()
. В вашем примере, results.userId.equals(AnotherMongoDocument._id)
. Тип ObjectID также имеет метод toString()
, если вы хотите сохранить стробированную версию ObjectID в формате JSON или файл cookie.
Если вы используете ObjectID = require("mongodb").ObjectID
(требуется собственная библиотека mongodb), вы можете проверить, является ли results.userId instanceof ObjectID
допустимым идентификатором с results.userId instanceof ObjectID
.
И т.п.
ObjectID
s – это объекты, поэтому, если вы просто сравниваете их с ==
вы сравниваете их ссылки. Если вы хотите сравнить их значения, вам нужно использовать метод ObjectID.equals
:
if (results.userId.equals(AnotherMongoDocument._id)) { ... }
Принятые ответы действительно ограничивают то, что вы можете сделать с вашим кодом. Например, вы не сможете искать массив Object Ids
с помощью метода equals. Вместо этого было бы разумнее всегда приводить строку и сравнивать ключи.
Вот пример ответа, если вам нужно использовать indexOf()
для проверки внутри массива ссылок для определенного идентификатора. Предположим, что query
– это запрос, который вы выполняете, предположим, что someModel
является моделью mongo для идентификатора, который вы ищете, и, наконец, предположите, что results.idList
– это поле, в котором вы ищете свой идентификатор объекта.
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); });
преобразование идентификатора объекта в строку (с использованием метода toString ()) выполнит задание.
Я столкнулся с одной и той же проблемой, и я просто решил проблему с помощью JSON.stringify()
следующим образом:
if (JSON.stringify(results.userId) === JSON.stringify(AnotherMongoDocument._id)) { console.log('This is never true'); }