Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/10/2013, 05:51
cmarrero01
 
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