Comparación de id de mangosta y cadenas
Tengo un nodo.aplicación js que extrae algunos datos y los pega en un objeto, como esto:
var results = new Object();
User.findOne(query, function(err, u) {
results.userId = u._id;
}
Cuando hago un if / entonces basado en ese ID almacenado, la comparación nunca es verdadera:
if (results.userId == AnotherMongoDocument._id) {
console.log('This is never true');
}
Cuando hago una consola.registro de los dos ID, coinciden exactamente:
User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002
Estoy asumiendo que esto es algún tipo de problema de tipo de datos, pero no estoy seguro de cómo convertir los resultados.userId a un tipo de datos que dará como resultado que la comparación anterior sea verdadera y mi cerebro subcontratado (también conocido como Google) tiene no he podido ayudar.
5 answers
Mongoose usa el controlador nativo mongodb, que usa el tipo ObjectId personalizado. Puede comparar objetos con el método .equals()
. Con su ejemplo, results.userId.equals(AnotherMongoDocument._id)
. El tipo ObjectId también tiene un método toString()
, si desea almacenar una versión stringificada del ObjectId en formato JSON, o una cookie.
Si utiliza ObjectID = require("mongodb").ObjectID
(requiere la biblioteca nativa de mongodb) puede comprobar si results.userId
es un identificador válido con results.userId instanceof ObjectID
.
Etc.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-24 19:38:21
ObjectID
s son objetos así que si solo los comparas con ==
estás comparando sus referencias. Si desea comparar sus valores, debe usar el método ObjectID.equals
:
if (results.userId.equals(AnotherMongoDocument._id)) {
...
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-24 19:38:07
Las respuestas aceptadas realmente limitan lo que puedes hacer con tu código. Por ejemplo, no sería capaz de buscar un array de Object Ids
utilizando el método equals. En su lugar, tendría más sentido siempre lanzar a string y comparar las teclas.
Aquí hay una respuesta de ejemplo en caso de que necesite usar indexOf()
para verificar dentro de una matriz de referencias para un id específico. asumir query
es una consulta que está ejecutando, asumir someModel
es un modelo mongo para el id que está buscando, y finalmente asumir results.idList
es el campo en el que está buscando su id de objeto.
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);
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-24 18:58:26
Convertir id de objeto a cadena(usando el método toString ()) hará el trabajo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-28 10:27:01
Me enfrenté exactamente al mismo problema y simplemente resolví el problema con la ayuda de JSON.stringify()
de la siguiente manera: -
if (JSON.stringify(results.userId) === JSON.stringify(AnotherMongoDocument._id)) {
console.log('This is never true');
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-21 17:59:58