2012-10-07 13 views
13

sto usando mongoose.js sul server node.js connessione a MongoDB e Ho un modello mangusta come il seguenteNon è possibile ottenere Mongoose.js documento secondario Array per popolare

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); 

che i pull con un comando come questo

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? 
}); 

mio problema è che non riesco subs.members matrice per popolare o addirittura carico, esso continua a mostrare come un array vuoto.

Ho provato .populate ("subs.members") senza alcun risultato, anche se i carichi subs._member proprio bene

+1

Sto cercando la soluzione a questo, come bene, i miei Subdocs due livelli di profondità non popoleranno. Ne hai mai trovato uno? –

+3

Questa è una funzionalità ampiamente richiesta che è attesa a breve. https://github.com/LearnBoost/mongoose/issues/601 – JohnnyHK

risposta

9

prova questo

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

funziona, la risposta più completa .. e ha preso correzioni di bug e soluzioni alternative dal team di manguste per arrivare a questo punto, anche se il problema originale non è mai stato risolto ..qualcuno ha inventato una soluzione alternativa per farlo funzionare ... https://gist.github.com/joeytwiddle/6129676 – chrishawn

0

ho qualcosa che sembra un po 'diverso, ma popola il documento con gli elementi di matrice. Mi chiedo se sono gli oggetti che causano i problemi.

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

questo è su un read/fetch non un salvataggio – chrishawn

+0

Ho cambiato il mio esempio. Spero che ti aiuti. –

+1

sì questo exmaples è ancora un livello meno complesso .. il mio array su mainchema popola sempre bene .. l'array sull'array di subschema è quello che non popola mai ... non penso che sia l'objectid perché l'objectid ref sul sottoelemento non in una matrice popola bene – chrishawn

7

@leesei: Non posso commentare il tuo post (troppo poco rep), quindi lascio questo come una risposta separata.

Nella popolazione di mangano 3.6 subdoc ancora non funziona, il problema github.com/LearnBoost/mongoose/issues/1381 è stato chiuso 7 mesi fa con la seguente soluzione come soluzione alternativa. Ho dovuto cambiarlo leggermente per unire il documento secondario popolato al documento principale.

modello del documento secondario Story deve essere specificato in modo esplicito:

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

Nella soluzione di cui sopra funziona:

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

ma questo ancora non funziona:

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

Avevo diversi livelli nidificati profondi di documenti secondari e nessuna delle opzioni fornite funzionava per me. Ho trovato questo fantastico plugin Mongoose che farà una popolazione profonda senza soluzione di continuità. Usi la stessa sintassi che ti aspetteresti per lavorare con Populate, ma in realtà funziona.

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

Problemi correlati