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

197

У меня есть приложение 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) не сможет помочь.

похлопывание
источник

Ответы:

361

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

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

И т.п.

cjohn
источник
13
Документы для .equals(): mongodb.github.io/node-mongodb-native/api-bson-generated/…
Энтони Паноззо,
4
Если вы уже используете, mongooseто можете просто require('mongoose').mongo.ObjectIDне
указывать
63

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

if (results.userId.equals(AnotherMongoDocument._id)) {
    ...
}
JohnnyHK
источник
17

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

Дила Гурунг
источник
8

Принятые ответы действительно ограничивают то, что вы можете сделать со своим кодом. Например, вы не сможете найти массив Object Idsс помощью метода equals. Вместо этого было бы разумнее всегда приводить к строке и сравнивать ключи.

Вот пример ответа в случае, если вам нужно использовать indexOf()для проверки в массиве ссылок для конкретного идентификатора. предположим query, что вы выполняете запрос, предположите, что someModelэто модель Монго для идентификатора, который вы ищете, и, наконец, предположите, 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);
});
r3wt
источник
1
или однострочник:let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
Златко
4
@ Златко Я не большой поклонник нового синтаксиса, но каждому свой.
r3wt
2
@ Златко const exists = results.idList.some(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor) или const exists = results.idList.some(val => val.equals(someModel._id))
аксанпи
1
@ Златко все эти годы спустя, и угадайте, что. Я предпочитаю вашу версию моей сейчас. не возражаешь, если я добавлю его в свой ответ с должным указанием?
r3wt
1
Цена прогресса :) Конечно, вы можете использовать ответ, его целью было предоставить альтернативу или помощь, если это возможно.
Златко
6

Исходя из вышеизложенного, я нашел три способа решения проблемы.

  1. AnotherMongoDocument._id.toString()
  2. JSON.stringify(AnotherMongoDocument._id)
  3. results.userId.equals(AnotherMongoDocument._id)
радость
источник
0

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

if (JSON.stringify(results.userId) === JSON.stringify(AnotherMongoDocument._id)) {
        console.log('This is never true');
}
Jitendra
источник
0

Предлагаемые здесь три возможных решения имеют разные варианты использования.

  1. Используйте .equals при сравнении ObjectID на двух mongoDocuments, как это

    results.userId.equals (AnotherMongoDocument._id)

  2. Используйте .toString () при сравнении строкового представления ObjectID с ObjectID mongoDocument. как это

    results.userId === AnotherMongoDocument._id.toString ()

Отец-Empire
источник
Какое третье возможное решение?
Крис Катиньяни