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});
};