¿Cómo convertir Mongo ObjectId .toString sin incluir el contenedor ‘ObjectId ()’ – solo el valor?

Lo que estoy tratando de resolver es: preservar el orden de mi conjunto de identificadores con $ en el uso de este método sugerido (mapReduce): ¿El pedido de $ en cláusula de MongoDB garantiza

He hecho mi tarea y he visto que es ideal convertirlos en cuerdas: comparando _id mongoose y cuerdas .

Código:

var dataIds = [ '57a1152a4d124a4d1ad12d80', '57a115304d124a4d1ad12d81', '5795316dabfaa62383341a79', '5795315aabfaa62383341a76', '57a114d64d124a4d1ad12d7f', '57953165abfaa62383341a78' ]; CollectionSchema.statics.all = function() { var obj = {}; //adds dataIds to obj.scope as inputs , to be accessed in obj.map obj.scope = {'inputs': dataIds}; obj.map = function() { //used toString method as suggested in other SO answer, but still get -1 for Id. var order = inputs.indexOf(this._id.toString()); emit(order, { doc : this }); }; obj.reduce = function() {}; obj.out = {inline: 1}; obj.query = {"_id": {"$in": dataIds } }; obj.finalize = function(key, value) { return value; }; return Product .mapReduce(obj) .then(function(products){ console.log('map products : ', products) }) }; 

Esto es lo que sigo volviendo para mi console.log en la promesa de productos:

 [{ _id: -1, value: null } ] 

Lo que me lleva a creer que no es capaz de hacer coincidir el ObjectId de esto, con un índice de dataIds. Sin embargo, si solo uso la cláusula $ in dentro de un .find (), se devuelven los productos correctos, pero en el orden incorrecto.

Actualizar:

obteniendo un comportamiento inesperado con esto.

  obj.map = function() { for(var i = 0; i < inputs.length; i++){ if(inputs[i] == this._id.toString()){ } emit(inputs[i], this); } }; 

emite:

  [ { _id: '5795315aabfaa62383341a76', value: null }, { _id: '57953165abfaa62383341a78', value: null }, { _id: '5795316dabfaa62383341a79', value: null }, { _id: '57a114d64d124a4d1ad12d7f', value: null }, { _id: '57a1152a4d124a4d1ad12d80', value: null }, { _id: '57a115304d124a4d1ad12d81', value: null } ] 

  obj.map = function() { for(var i = 0; i < inputs.length; i++){ if(inputs[i] == this._id.toString()){ var order = i; } emit(this._id.toString(), this); } }; 

emite:

 [ { _id: 'ObjectId("5795315aabfaa62383341a76")', value: null }, { _id: 'ObjectId("57953165abfaa62383341a78")', value: null }, { _id: 'ObjectId("5795316dabfaa62383341a79")', value: null }, { _id: 'ObjectId("57a114d64d124a4d1ad12d7f")', value: null }, { _id: 'ObjectId("57a1152a4d124a4d1ad12d80")', value: null }, { _id: 'ObjectId("57a115304d124a4d1ad12d81")', value: null } ] 

Ahora, ¿cómo me deshago de la envoltura ObjectId ()? Preferiblemente, algo más limpio que str.slice (), que funcionaría. Sin embargo, creo que debe haber una forma más “segura” de convertir el Id.

Revisé los documentos, pero solo menciona el método toString (), que no parece funcionar correctamente en el mapa: https://docs.mongodb.com/manual/reference/method/ObjectId.toString/

Lo averigué:

  obj.map = function() { for(var i = 0; i < inputs.length; i++){ if(this._id.equals(inputs[i])) { var order = i; } } emit(order, {doc: this}); };