2011-12-30 16 views
5

Aquí está mi código de prueba que no puedo entender por qué no está funcionando, ya que es muy similar a la prueba 'populating multiple children of a sub-array at a time'.Mangosta poblar

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema, 
    ObjectId = Schema.ObjectId; 

mongoose.connect('mongodb://localhost/testy'); 

var UserSchema = new Schema({ 
    name: String 
}); 

var MovieSchema = new Schema({ 
    title: String, 
    tags: [OwnedTagSchema] 
}); 

var TagSchema = new Schema({ 
    name: String 
}); 

var OwnedTagSchema = new Schema({ 
    _name: {type: Schema.ObjectId, ref: 'Tag'}, 
    _owner: {type: Schema.ObjectId, ref: 'User'} 
}); 

var Tag = mongoose.model('Tag', TagSchema), 
    User = mongoose.model('User', UserSchema), 
    Movie = mongoose.model('Movie', MovieSchema); 
    OwnedTag = mongoose.model('OwnedTag', OwnedTagSchema); 

User.create({name: 'Johnny'}, function(err, johnny) { 
    Tag.create({name: 'drama'}, function(err, drama) { 
     Movie.create({'title': 'Dracula', tags:[{_name: drama._id, _owner: johnny._id}]}, function(movie) { 

      // runs fine without 'populate' 
      Movie.find({}).populate('tags._owner').run(function(err, movies) { 
       console.log(movies); 
      }); 
     }); 
    }) 
}); 

de error producida es

node.js:201 
     throw e; // process.nextTick error, or 'error' event on first tick 
      ^
TypeError: Cannot call method 'path' of undefined 
    at /Users/tema/nok/node_modules/mongoose/lib/model.js:234:44 

actualización

se deshizo de OwnedTag y reescribió MovieSchema como el código

var MovieSchema = new Schema({ 
    title: String, 
    tags: [new Schema({ 
     _name: {type: Schema.ObjectId, ref: 'Tag'}, 
     _owner: {type: Schema.ObjectId, ref: 'User'} 
    })] 
}); 

Trabajando https://gist.github.com/1541219

Respuesta

1

Espero que tu código funcione también. ¿Funciona si coloca el OwnedTag a la derecha en MovieSchema, como tal?

var MovieSchema = new Schema({ 
    title: String, 
    tags: [{ 
      _name: {type: Schema.ObjectId, ref: 'Tag'}, 
      _owner: {type: Schema.ObjectId, ref: 'User'} 
     }] 
}); 

edición:

var MovieSchema = new Schema({ 
    title: String, 
    tags: [{ type: Schema.ObjectId, ref: 'OwnedTag' }] 
}); 
+0

No, el mismo resultado :-( – spacevillain

+1

Ah. En realidad, regrese a su modelo original. Está usando '.populate' pero está usando un subdocumento para' tags', no una referencia. No lo hago esperamos que funcione, estamos cada vez más lejos de la solidez de una base de datos NoSQL, pero, tal vez esto funcione, consulte el segundo intento adicional anterior. – danmactough

+0

Esto rompe todo :-(No obtengo lo que es la diferencia entre https://github.com/LearnBoost/mongoose/blob/master/test/model.ref.test.js#L1109 Tal vez usted me puede ayudar a verlo? – spacevillain

2

La variable de OwnedTagSchema debe definirse antes de usarla o que va a terminar haciendo básicamente esto:

var MovieSchema = new Schema({ 
    title: String, 
    tags: [undefined] 
}); 

pasar por encima de MovieSchema definición.