type parts new mongo long _id javascript node.js mongodb mongoose mapreduce

javascript - parts - mongoose objectid to string



Cómo convertir mongo ObjectId.toString sin incluir el contenedor ''ObjectId()''-¿solo el valor? (1)

Lo que estoy tratando de resolver es: preservar el orden de mi matriz de IDs con $ in utilizando este método sugerido (mapReduce): ¿MongoDB''s $ in clause garantiza orden?

He hecho los deberes y vi que es ideal convertirlos en cuerdas: Comparando _id y cuerdas de mangosta .

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 recibiendo por mi console.log en la promesa de productos:

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

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

Actualizar:

teniendo 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 "mongo" / segura de convertir el Id.

Revisé los documentos, pero solo menciona el método toString (), que no parece funcionar correctamente dentro del 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}); };