Pasando datos de una petición a un subdocumento de mongoose

nodejs mongodb mongoose

nodejs mongodb mongoose rest

El año inició (está más que claro!) y con ello nuevas ideas de proyectos para desarrollar, ahora le ha llegado el momento a nodejs y mongodb a través de mongoose.

En este artículo describiré un poco una forma bastante limpia de pasar los datos de una petición enviada a través de una API en REST hacia un modelo en mongoose, pero no es un documento normal, sino que será un documento con subdocumento y éste último con muchas propiedades.

Sucede que cuando usamos submodelos y queremos guardar los valores enviados por request con mongoose, no hay forma de realizar una asignación automática, por lo que se debe hacer asignación propiedad por propiedad y es fácil mientras no se tenga un submodelo con más de 10 propiedades.

// con algo de imaginación pensemos que esto es un documento
var document = new mongoose.Schema({
    subdocument: {
        prop1:{String},
        prop2:{String},
        prop3:{String},
        prop4:{String},
        prop5:{String},
        prop6:{String},
        prop7:{String},
        prop8:{String},
        prop9:{String},
        prop0:{String},
    }
});

Ahora digamos que queremos actualizar las props de subdocument y como mongoose no lo permite (chafa), es que hay que utilizar el loop.

// haciendo la asignación de forma manual
parent.child.id(request.params.child_id).prop1 = request.params.prop1;
parent.child.id(request.params.child_id).prop2 = request.params.prop2;
parent.child.id(request.params.child_id).prop3 = request.params.prop3;
parent.child.id(request.params.child_id).prop4 = request.params.prop4;
parent.child.id(request.params.child_id).prop5 = request.params.prop5;
parent.child.id(request.params.child_id).prop6 = request.params.prop6;
// ... y así para todas las demás propiedades

Y es una lástima que mi versión de mongoose no me permita hacer la asignación de la forma parent.child.id(request.params.child_id) = request.params

// ahora haciendo lo mismo de forma automática
for(var arg in request.params) {
    parent.child.id(request.params.child_id)[arg] = request.params[arg];
}

Explicando lo anterior, desde el cliente se envió una petición con muchas variables con nombres como prop1, prop2, prop3, etc… la idea es pasarlas automáticamente al subdocumento, donde parent.child.id() se utiliza para localizar el subdocumento (pasando como parámetro el id del subdocumento obviamente) y como esto es básicamente un objeto literal, lo único que se debe de hacer en el loop es la asignación utilizando el nombre de la variable enviada por request.

Creo que esto es posible de hacer sin el loop, pero como estoy en versión pre de nodejs, quizás tenga algunas incompatibilidades que hacen que escrib un poco más de código, igual a alguien le sirve.

Happy Coding!

Co-fundador de Qbit Mexhico, usuario de linux, Developer en tecnologías web.. Nicaragüense, centro en basketball, primer centro en rugby y pintor los fines de semana. Ortögrafo y ambientalista psicológico (de escritorio).. ese soy yo!

Si te ha servido compártelo y difunde nuestro blog..

Facebook Twitter LinkedIn Google+ Flickr YouTube Skype 

Compartir en...Tweet about this on TwitterPin on Pinterest0Share on LinkedIn1Share on Google+0Share on Facebook1