Foros del Web » Programando para Internet » Node.js »

[SOLUCIONADO] Populate consulta con Node.js y Mongodb

Estas en el tema de Populate consulta con Node.js y Mongodb en el foro de Node.js en Foros del Web. Hola todos, estoy teniendo problemas para relacionar informacion entre dos colleciones de MongoDb. Ya que se que mongodb no es una base de datos relacional, ...
  #1 (permalink)  
Antiguo 07/10/2013, 05:51
 
Fecha de Ingreso: abril-2011
Ubicación: Mendoza
Mensajes: 42
Antigüedad: 13 años
Puntos: 0
Exclamación Populate consulta con Node.js y Mongodb

Hola todos, estoy teniendo problemas para relacionar informacion entre dos colleciones de MongoDb.

Ya que se que mongodb no es una base de datos relacional, pero igual, deberia poder relacionar informacion, como usuarios y paises, por ejemplo:

Bien es siguiente es mi codigo, que funciona perfecto menos el populate, me devuelve null el campo que deberia devolverme el pais:

Este seria el model o el schema de mongodb:

Código Javascript:
Ver original
  1. var mongoose = require('mongoose'),
  2.     Schema   = mongoose.Schema;
  3.  
  4. //Listado de paises
  5. var countrySchema = new Schema({
  6.     country:{ type: String }
  7. });
  8.  
  9. //Usuarios del sistema
  10. var userSchema = new Schema({
  11.     full_name:{ type: String },
  12.     username: { type: String, required: true, index: { unique: true }},
  13.     email:    { type: String, required: true, index: { unique: true } },
  14.     password: { type: String, required: true },
  15.     birthday: { type: String },
  16.     country:  { type : Schema.Types.ObjectId, ref : 'Country' },
  17.     genre:    { type: String, enum: ['Female', 'Male'] }
  18. });
  19.  
  20. //Dejamos el schema para que se acceda desde afuera del archivo
  21. exports.Country = mongoose.model('Country', countrySchema);
  22. //Dejamos el schema para que se acceda desde afuera del archivo
  23. exports.User = mongoose.model('User', userSchema);

Bien, esto lo cargo dentro del metodo que lo llama, de la siguiente manera:

Código Javascript:
Ver original
  1. //Traemos el modelo de base de datos
  2. var UserSchema = require('../models/userModel.js');
  3. //Dejamos accesso desde afuera
  4. exports = module.exports = User;
  5. //Controller de usuarios
  6. function User(){
  7.     var self = this;
  8.  
  9.     //Select 1 user
  10.     this.getUsers = function(req, res) {
  11.         UserSchema.User.find().populate('country').exec(function(err, user){
  12.             if(!err){
  13.                 res.json(user);
  14.             } else {
  15.                 console.log('ERROR: ' + err);
  16.             }
  17.         });
  18.     };
  19. }

Y con Express hago las rutas para poder ejectuar este metodo...

Código Javascript:
Ver original
  1. //Manejo del usuario
  2.     user = new user(mongoose);
  3.     app.get('/user', user.getUsers);
  4.     app.get('/user/:id', user.getUser);
  5.     app.post('/user', user.updateUser);
  6.     app.put('/user', user.addUser);

Todo esto lo llamado desde un archivo index.js..

y mi resultado es el siguiente

[
{
"full_name": "Claudio A. Marrero",
"username": "cmarrero01",
"email": "[email protected]",
"password": "xxxxxxxxxxxxxx",
"birthday": "08/02/1985",
"country": null,
"genre": "Male",
"_id": "524f36e34ca6e9c82a000001",
"__v": 0
},
{
"full_name": "Claudio A. Marrero",
"username": "cmarrero02",
"email": "[email protected]",
"password": "xxxxxxxxxxx",
"birthday": "08/02/1985",
"country": null,
"genre": "Male",
"_id": "524f3a6a0e8dbf0425000002",
"__v": 0
}


Como veran, country es "null", cuando deberia ser el registro dentro de la collection country...

No he logrado hacer que ese valor tenga la inforacion correspondiente, si no es con el populate, de que manera puedo relacionar la informacion entre dos collectiones?
__________________
Claudio A. Marrero - Proyect Manager
  #2 (permalink)  
Antiguo 07/10/2013, 06:18
 
Fecha de Ingreso: abril-2011
Ubicación: Mendoza
Mensajes: 42
Antigüedad: 13 años
Puntos: 0
Respuesta: Populate consulta con Node.js y Mongodb

Probe con algo asi, pero tampoco funciona:

Código Javascript:
Ver original
  1. // populates a single object
  2.         UserSchema.User.find(function (err, user) {
  3.  
  4.             var opts = [
  5.                 { path: 'country', match: { x: 1 }, select:'name' }
  6.             ]
  7.  
  8.             UserSchema.User.populate(user, opts, function (err, user) {
  9.                 console.log(user);
  10.                 res.json(user);
  11.             })
  12.         })

Cmabie el modelo de country y en vez del campo country puse el name... pero nop.
__________________
Claudio A. Marrero - Proyect Manager
  #3 (permalink)  
Antiguo 07/10/2013, 07:43
 
Fecha de Ingreso: abril-2011
Ubicación: Mendoza
Mensajes: 42
Antigüedad: 13 años
Puntos: 0
Respuesta: Populate consulta con Node.js y Mongodb

Bueno, quedo resulto, habia que definir el modelo... algo asi:

Código Javascript:
Ver original
  1. var mongoose = require('mongoose'),
  2.     Schema   = mongoose.Schema;
  3.  
  4. //Listado de paises
  5. var countrySchema = new Schema({
  6.     name:{ type: String }
  7. });
  8.  
  9. //Usuarios del sistema
  10. var userSchema = new Schema({
  11.     full_name:{ type: String },
  12.     username: { type: String, required: true, index: { unique: true }},
  13.     email:    { type: String, required: true, index: { unique: true } },
  14.     password: { type: String, required: true },
  15.     birthday: { type: String },
  16.     country:  { type : Schema.Types.ObjectId, ref : 'Country' },
  17.     genre:    { type: String, enum: ['Female', 'Male'] }
  18. });
  19.  
  20. var Country = mongoose.model('Country', countrySchema, 'CountryModel');
  21. var User = mongoose.model('User', userSchema, 'UserModel');
  22. exports.Country = Country;
  23. exports.User = User;
__________________
Claudio A. Marrero - Proyect Manager

Etiquetas: mongodb
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:47.