Сравнение мангуста _id и строк

137

У меня есть приложение 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 в тип данных, который приведет к тому, что приведенное выше сравнение будет истинным, а мой внешний аутсорсинг (aka Google) не смог помощь.

Теги:
mongoose

5 ответов

255
Лучший ответ

Mongoose использует собственный драйвер mongodb, который использует настраиваемый тип ObjectID. Вы можете сравнить ObjectIDs с методом .equals(). В вашем примере results.userId.equals(AnotherMongoDocument._id). Тип ObjectID также имеет метод toString(), если вы хотите сохранить стробированную версию ObjectID в формате JSON или файл cookie.

Если вы используете ObjectID = require("mongodb").ObjectID (требуется собственная библиотека mongodb), вы можете проверить, является ли results.userId допустимым идентификатором с results.userId instanceof ObjectID.

Etc.

  • 8
    Документы для .equals() : mongodb.github.io/node-mongodb-native/api-bson-generated/…
  • 3
    Если вы уже используете mongoose вы можете просто require('mongoose').mongo.ObjectID чтобы вам не приходилось перечислять дополнительные зависимости
52

ObjectID - это объекты, поэтому, если вы просто сравниваете их с ==, вы сравниваете их ссылки. Если вы хотите сравнить их значения, вам нужно использовать метод ObjectID.equals:

if (results.userId.equals(AnotherMongoDocument._id)) {
    ...
}
7

Принятые ответы действительно ограничивают то, что вы можете сделать с вашим кодом. Например, вы не сможете найти массив 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);
});
  • 1
    или однострочник: let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
  • 4
    @ Златко Я не большой поклонник нового синтаксиса, но каждому свой.
Показать ещё 3 комментария
6

преобразование идентификатора объекта в строку (с помощью метода toString()) выполнит задание.

0

Я столкнулся с одной и той же проблемой, и я просто решил проблему с помощью JSON.stringify() следующим образом:

if (JSON.stringify(results.userId) === JSON.stringify(AnotherMongoDocument._id)) {
        console.log('This is never true');
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню