2012-10-07 17 views
13

estoy usando mongoose.js en el servidor Node.js conexión a MongoDB y Tengo un modelo de mangosta como la siguienteno puede obtener Mongoose.js Subdocumento Array para poblar

SubSchema = new Schema({ 
    _member:  {type: ObjectId, ref: 'Member'}, 
    members:  [{type: ObjectId, ref: 'Member'}], 
    created:  { type: Date, default: Date.now } 
}); 
mongoose.model('SubModel', SubSchema); 

MainSchema = new Schema({ 
    _member:  {type: ObjectId, ref: 'Member'}, 
    subs:  [SubSchema], 
    members:  [{type: ObjectId, ref: 'Member'}], 
    created:  { type: Date, default: Date.now } 
}); 
var MainModel mongoose.model('MainModel', MainSchema); 

la que me tire con un comando como este

var q = MainModel.find({}) 
       .sort('created', -1) 
       .limit(25) 
       .populate("_member") 
       .populate("subs._member") 
       .populate("subs.members"); 

q.execFind(function(err, mains){ 
    //mains[0].subs[0].members - will always be empty why? 
}); 

mi problema es que no puedo conseguir subs.members matriz para rellenar o incluso cargar, simplemente sigue mostrando como una matriz vacía.

He intentado .populate ("") subs.members en vano a pesar de que las cargas subs._member simplemente finas

+1

Busco la solución a esto también, mis Subdocs dos niveles de profundidad no poblarán. ¿Alguna vez has encontrado uno? –

+3

Esta es una característica ampliamente solicitada que se espera pronto. https://github.com/LearnBoost/mongoose/issues/601 – JohnnyHK

Respuesta

9

intente esto

SubSchema = new Schema({ 
     _member:  {type: ObjectId, ref: 'Member'}, 
     members:  [{type: ObjectId, ref: 'Member'}], 
     created:  { type: Date, default: Date.now } 
    }); 
    var SubModel = mongoose.model('SubModel', SubSchema);//add 

    MainSchema = new Schema({ 
     _member:  {type: ObjectId, ref: 'Member'}, 
     subs:  [SubSchema], 
     members:  [{type: ObjectId, ref: 'Member'}], 
     created:  { type: Date, default: Date.now } 
    }); 

    var MainModel = mongoose.model('MainModel', MainSchema); 

    MainModel.find({}) 
      .sort('created', -1) 
      .limit(25) 
      .populate("_member") 
      .populate("subs._member") 
      .exec(function(err, mains){ 

       //add 
       SubModel.populate(mains,{ 
        path:'subs.members' 
       },function(err,mains){ 
        //mains[0].subs[0].members - is not empty 
       }); 
      }); 
+0

funciona, la respuesta más completa ... y tomó correcciones de errores y soluciones del equipo de mangosta para llegar a este punto, aunque el problema original nunca fue corregido.alguien encontró una solución para que funcione también ... https://gist.github.com/joeytwiddle/6129676 – chrishawn

0

tengo algo que se parece un poco diferente, pero rellena el documento con los elementos de matriz. Me pregunto si es el objeto que está causando los problemas.

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

var SubSchema = new Schema({ 
    testsub: String,  
    created: { type: Date, default: Date.now } 
}); 

var MainSchema = new Schema({ 
    test: String 
    subs: [SubSchema], 
    created: { type: Date, default: Date.now } 
}); 

mongoose.model('MainSchema', MainSchema, mainschema); 

var query = MainSchema.find({}); 
+0

esto está en un read/fetch no a save – chrishawn

+0

Cambié mi ejemplo. Espero que te ayude. –

+1

Sí, este exmaples es aún un nivel menos complejo ... mi matriz en mainschema siempre rellena bien ... la matriz en la matriz de subschema es la que nunca se llena ... no creo que sea el objectid porque el objeto ref en el subelemento que no está en una matriz aparece bien – chrishawn

7

@leesei: No puedo comentar en su puesto (muy poco rep), así que lo dejo como una respuesta separada.

En mongoose 3.6 subdoc población todavía no funciona, el problema github.com/LearnBoost/mongoose/issues/1381 se ha cerrado hace 7 meses con la siguiente solución como solución. Tuve que cambiarlo ligeramente para fusionar el subdocumento poblado de nuevo al documento principal.

El modelo del subdocumento Story se tiene que especificar explícitamente:

Person.findById(user1._id).populate("stories") 
    .exec(function(err, doc { 
     Story.populate(doc.stories, {path: 'creator'}, function (err, stories) { 
      doc.stories = stories; 
      return doc; 
     }) 
}) 

En la solución anterior funciona esto:

Story.populate(doc.stories, {path: 'creator'}, callback) 

pero esto todavía no funcionará:

Story.populate(doc, {path: 'stories.creator'}, callback) 
0

Tenía varias capas de nido más allá de los documentos secundarios, y ninguna de las opciones suministradas funcionó para mí. Encontré este increíble plugin de Mongoose que hará una población profunda sin interrupciones. Simplemente usa la misma sintaxis con la que esperaría trabajar con populate, pero en realidad funciona.

https://github.com/buunguyen/mongoose-deep-populate

Cuestiones relacionadas