Сравнение 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 двух идентификаторов, они точно соответствуют:

 User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002 

Я предполагаю, что это какая-то проблема с типами данных, но я не уверен, как преобразовать results.userId в тип данных, который приведет к тому, что приведенное выше сравнение будет истинным, и мой внешний мозг (он же Google) не смог бы помочь.

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'); } 
  • Node.js - мониторинг базы данных для изменений
  • Nodejs отправляет файл в ответ
  • Хотя цикл с обещаниями
  • npm install не работает
  • создать надежный самоподписанный SSL-сертификат для localhost (для использования с Express / Node)
  • В какой области переменные модуля хранятся в node.js?
  • Nodejs HTTP и HTTPS через один и тот же порт
  • Могут ли mongo обновить данные массива?
  • Имя динамического тега в jsx и React
  • Express.js req.body undefined
  • Совместное использование сеансов между php и узлом
  • Interesting Posts

    Удаление библиотек из боковой панели Explorer 8

    asp.net mvc: почему Html.CheckBox генерирует дополнительный скрытый ввод

    Как просмотреть стек вызовов текущего процесса / потока?

    Ffmpeg соединяет два файла mp4 с ffmpeg в командной строке

    Мой ноутбук не будет спать, когда я закрываю крышку

    Как утверждать, что Iterable содержит элементы с определенным свойством?

    Что такое амортизированный анализ алгоритмов?

    Метод может быть сделан статическим, но должен ли он?

    Получение «Ошибка:« output.path »должен быть абсолютным путем или` / `

    Как я могу легко сделать страницы для печати на любом веб-сайте?

    Java: Обоснование интерфейса Cloneable

    Что конкретно представляют опасности eval (parse (…))?

    Как пользователь с аутентификацией ключей SSH обладает полномочиями sudo в Ansible?

    Angular2: использовать Pipe для визуализации шаблонов динамически

    Получение координат представления относительно корневого макета

    Давайте будем гением компьютера.