2012-10-07 9 views
13

używam mongoose.js na serwerze node.js podłączeniem do MongoDB i Mam modelu Mongoose jak następujeNie można uzyskać Mongoose.js dokument podrzędny Array zapełnić

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

które ciągnę z poleceniem tej

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

moim problemem jest to, że nie mogę dostać subs.members tablica do zapełniania lub nawet załadować, to po prostu utrzymuje pokazując jako pustą tablicę.

Próbowałem .populate („subs.members”) bezskutecznie, mimo obciążeń subs._member dobrze

+1

szukam rozwiązanie tego jak dobrze, moje subdocs dwa poziomy głębokości nie będzie zapełnić. Czy kiedykolwiek go znalazłeś? –

+3

Jest to bardzo popularna funkcja, której można się spodziewać wkrótce. https://github.com/LearnBoost/mongoose/issues/601 – JohnnyHK

Odpowiedz

9

spróbuj tego

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

działa, najbardziej kompletna odpowiedź .. i zabrało poprawki błędów i obejścia od zespołu manga, aby dostać się do tego punktu, chociaż oryginalny problem nigdy nie został rozwiązany ..ktoś wymyślił obejście, żeby to zadziałało ... https://gist.github.com/joeytwiddle/6129676 – chrishawn

0

mam coś, co wygląda nieco inaczej ale zapełnia dokument z elementów tablicy. Zastanawiam się, czy to przedmiot, który powoduje problemy.

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

to jest odczyt/pobieranie, a nie zapis – chrishawn

+0

Zmieniłem mój przykład. Mam nadzieję, że ci to pomoże. –

+1

taa egzmaple jest nadal o jeden poziom mniej złożona .. moja tablica na temat mainschema zawsze zapełnia się dobrze ... tablica na tablicy subschema jest tą, która nigdy nie zapełnia się ... nie sądzę, że jest objectid ponieważ ref na podelementie nie w tablicy godnie jest – chrishawn

7

@leesei: Nie mogę wypowiedzieć się na temat Twojego posta (zbyt mało rep), więc pozostawiam to jako oddzielną odpowiedź.

W mangusty 3.6 populacja subdoc nadal nie działa, problem github.com/LearnBoost/mongoose/issues/1381 został zamknięty 7 miesięcy temu z następującym rozwiązaniem jako obejście tego problemu. Musiałem to nieco zmienić, aby scalić zaludniony dokument z powrotem z głównym dokumentem.

na dokument podrzędny w modelu Story musi być określona jednoznacznie:

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

W rozwiązaniu powyżej to działa:

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

ale to nadal nie będzie działać:

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

Miałem kilka warstw gniazd w głąb subdokumentów i żadna z dostarczonych opcji nie działała dla mnie. Znalazłem tę niesamowitą wtyczkę Mongoose, która bezproblemowo wykona głęboką populację. Po prostu użyjesz tej samej składni, w której będziesz pracować z zapełnianiem, ale to faktycznie działa.

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

Powiązane problemy