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.

Author: Nahn, 2012-07-24

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.

 243
Author: cjohn,
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

ObjectIDs 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)) {
    ...
}
 50
Author: JohnnyHK,
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);
});
 7
Author: r3wt,
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.

 6
Author: Dila Gurung,
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');
}
 0
Author: Jitendra,
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