2012-07-24 30 views
113

Tengo una aplicación Node.js que tira algunos datos y lo pega en un objeto, como esto:_id mangosta y cuerdas

var results = new Object(); 

User.findOne(query, function(err, u) { 
    results.userId = u._id; 
} 

Cuando hago un si/entonces sobre la base de que el ID almacenado, el Nunca comparación es verdadera:

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

Cuando hago un console.log de los dos identificadores, que coinciden exactamente:

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002 

estoy tan Esto es un tipo de problema de tipo de datos, pero no estoy seguro de cómo convertir results.userId a un tipo de datos que dará como resultado que la comparación anterior sea cierta y mi cerebro subcontratado (también conocido como Google) no haya podido ayudar.

Respuesta

204

Mangosta utiliza el controlador nativo MongoDB, que utiliza el tipo de objeto personalizado. Puede comparar los ObjectID 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 codificada del ObjectID en formato JSON o una cookie.

Si usa ObjectID = require("mongodb").ObjectID (requiere la biblioteca mongodb-native) puede verificar si results.userId es un identificador válido con results.userId instanceof ObjectID.

Etc.

+7

Documentos para '.equals()': http://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html#equals –

+1

Si ya está usando 'mongoose' puede simplemente 'require (' mongoose '). mongo.ObjectID' por lo que no tiene que enumerar ninguna dependencia adicional – JoshuaDavid

48

ObjectID s son objetos por lo que si solo los compara con == va a comparar sus referencias. Si desea comparar sus valores es necesario utilizar el método ObjectID.equals:

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

Las respuestas aceptadas realmente limita lo que puede hacer con su código. Por ejemplo, no podría buscar una matriz de Object Ids utilizando el método equals. En su lugar, tendría más sentido siempre lanzar a la secuencia y comparar las claves.

Aquí hay un ejemplo de respuesta en caso de que necesite usar indexOf() para verificar dentro de una matriz de referencias para una identificación específica. asume query es una consulta que se está ejecutando, se supone someModel es un modelo mongo para la Identificación del que busca, y finalmente asume results.idList es el campo que busca su identificador de objeto en.

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

o una línea: 'let exists = results.idList.filter (val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor) .length? true: false' – Zlatko

+2

@Zlatko No soy un gran admirador de la nueva sintaxis, pero cada uno es suyo. existe – r3wt

+0

@Zlatko 'const = results.idList.some (val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor)' existe o 'const = results.idList.some (val => val.equals (someModel._id)) ' – Pysul

4

conversión de ID de objeto de string (usando el método toString()) hará el trabajo.