2012-10-07 10 views
13

aufzufüllen ich mongoose.js auf einem node.js Server verbunden bin mit MongoDB und Ich habe ein Mungo-Modell wie folgtKann nicht Mongoose.js Subdocument Array erhalten

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

, die ich ziehen mit einem Befehl wie diesem

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

mein Problem ist, dass ich nicht subs.members Array oder sogar laden zu füllen bekommen können, es wird einfach wie ein leeres Array zeigt.

Ich habe versucht, .populate („subs.members“) ohne Erfolg, obwohl subs._member Lasten ganz gut

+1

ich dies für die Lösung auch suchen, wird mein Subdocs zwei Ebenen tief nicht füllen. Hast du jemals einen gefunden? –

+3

Dies ist eine weithin geforderte Funktion, die in Kürze erwartet wird. https://github.com/LearnBoost/mongoose/issues/601 – JohnnyHK

Antwort

9

versuchen Sie dies

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

funktioniert, vollständigste Antwort .. und es dauerte Fehlerbehebungen und Umgehungslösungen aus dem Mungo-Team, um zu diesem Punkt zu gelangen, obwohl das ursprüngliche Problem nie behoben wurde ..jemand hat einen Workaround gefunden, damit er auch funktioniert ... https://gist.github.com/joeytwiddle/6129676 – chrishawn

0

ich etwas haben, das eine etwas andere aussieht, sondern füllt das Dokument mit den Array-Elemente. Ich frage mich, ob es die Objekt-IDs sind, die die Probleme verursachen.

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

Dies ist auf einem Lese-/Abruf nicht speichern – chrishawn

+0

Ich habe mein Beispiel geändert. Hoffe es hilft dir aus. –

+1

Ja, das ist immer noch eine Ebene weniger komplex .. mein Array auf Hauptschemaplättchen füllt immer gut .. das Array auf dem Array von Teilschema ist dasjenige, das nie besiedelt ... ich glaube nicht, dass es das Objekt ist, weil das ObjectID Ref auf dem Unterpunkt nicht in einem Array popuates feine – chrishawn

7

@leesei: Ich kann nicht auf Ihre Post (zu wenig rep kommentieren), also lasse ich das als separate Antwort.

In mongoose 3.6 subdoc Bevölkerung funktioniert immer noch nicht, das Problem github.com/LearnBoost/mongoose/issues/1381 wurde vor 7 Monaten mit der folgenden Lösung als Workaround geschlossen. Ich musste es leicht ändern, um das aufgefüllte Filialdokument wieder mit dem Hauptdokument zusammenzuführen.

Das Modell des Subdokument Story hat explizit angegeben werden:

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

In der Lösung über das funktioniert:

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

aber immer noch nicht funktionieren:

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

Ich hatte mehrere Unterschichten tief in Unterdokumenten, und keine der mitgelieferten Optionen funktionierte für mich. Ich habe dieses erstaunliche Mongoose-Plugin gefunden, das nahtlos in die Bevölkerung pumpt. Sie verwenden nur die gleiche Syntax, mit der Sie normalerweise arbeiten würden, aber es funktioniert tatsächlich.

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