Сравнение 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 в тип данных, который приведет к тому, что приведенное выше сравнение будет истинным, а мой внешний аутсорсинг (aka Google) не смог помощь.
Ответы
Ответ 1
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.
Ответ 2
ObjectID
- это объекты, поэтому, если вы просто сравниваете их с ==
, вы сравниваете их ссылки. Если вы хотите сравнить их значения, вам нужно использовать метод ObjectID.equals
:
if (results.userId.equals(AnotherMongoDocument._id)) {
...
}
Ответ 3
преобразование идентификатора объекта в строку (с помощью метода toString()) выполнит задание.
Ответ 4
Принятые ответы действительно ограничивают то, что вы можете сделать с вашим кодом. Например, вы не сможете найти массив 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);
});
Ответ 5
Согласно вышеизложенному, я нашел три способа решения проблемы.
-
AnotherMongoDocument._id.toString()
-
JSON.stringify(AnotherMongoDocument._id)
-
results.userId.equals(AnotherMongoDocument._id)
Ответ 6
Я столкнулся с одной и той же проблемой, и я просто решил проблему с помощью JSON.stringify()
следующим образом:
if (JSON.stringify(results.userId) === JSON.stringify(AnotherMongoDocument._id)) {
console.log('This is never true');
}
Ответ 7
У меня была такая же проблема, и я использовал .equals(), и это не сработало, но когда я преобразовал объект в строку с помощью .toString(), это сработало для меня