2017-03-18 4 views
0

Ich habe zwei Modelle; eine für die Benutzer und die andere für die StudyGroup. Jede StudyGroup hat ein eindeutiges Feld guid. Das Benutzer Modell verfügt über ein Feld von studyGroups, das ein Array von Zeichenfolgen guid ist. Ein Benutzer kann mehreren Lerngruppen beitreten.Mongoose-Aggregat, das unerwünschtes leeres Array zurückgibt

Benutzer Modell

const userSchema = new Schema({ 
    cuid: { type: 'String', required: true }, 
    firstName: { type: 'String', required: true }, 
    lastName: { type: 'String', required: true }, 
    studentId: { type: 'Number', required: true }, 
    password: { type: 'String', required: true }, 
    email: { type: 'String', required: true }, 
    dateAdded: { type: 'Date', default: Date.now, required: true }, 
    lastLogin: { type: 'Date', default: null, required: false }, 
    studyGroups: [{ type: 'String' }], 
}); 

Forshungsgruppe Modell

const studyGroupSchema = new Schema({ 
    guid: { type: 'String', required: true }, 
    groupName: { type: 'String', required: true }, 
    course: { type: 'String', required: true }, 
    teacher: { type: 'String', required: true }, 
    description: { type: 'String', required: true }, 
    dateAdded: { type: 'Date', default: Date.now, required: true }, 
    chatMessages: [{ type: 'String' }], 
}); 

ich alle Lerngruppen in der studyGroup Array des Benutzer Modell finden möchten die Saiten mit guid innerhalb des Arrays gespeichert . Senden Sie dann die entsprechenden studyGroup-Objekte an das Frontend.

export function getUserStudyGroups(req, res) { 
    User.aggregate([ 
    { "$unwind": "$studyGroups" }, 
    { 
     "$lookup": { 
     "from": "studyGroups", 
     "localField": "studyGroups", 
     "foreignField": "cuid", 
     "as": "resultingStudyGroupsArray" 
     } 
    }, 
    { "$unwind": "$resultingStudyGroupsArray" }, 
    { 
     "$group": { 
     "_id": null, 
     "myStudyGroups": { "$addToSet": "$resultingStudyGroupsArray" }, 
     "count": { "$sum": 1 } 
     } 
    } 
    ]).exec(function(err, results){ 
    console.log(results); 
    return res.json({ studyGroups: results }); 
    }); 
} 

Der obige Code gibt mir jedoch nur ein leeres Array zurück. Aber ich möchte ein Array von studyGroup-Objekten zurückgeben.

+1

' resultingTagsArray' Sie keine Tags resultierende Array irgendwo angelegt haben. Was ist es? –

+0

Whoops, ich habe vergessen, das zu ändern. Lass mich sehen, ob das das Problem war. – pbgnz

+0

Noch leeres Array nach dem Ändern des 'resultingTagsArray' in' resultingStudyGroupsArray' – pbgnz

Antwort

0

foreignField sollte guid sein.

export function getUserStudyGroups(req, res) { User.aggregate([ 
    { "$unwind": "$studyGroups" }, 
    { 
     "$lookup": { 
     "from": "studyGroups", 
     "localField": "studyGroups", 
     "foreignField": "guid", 
     "as": "resultingStudyGroupsArray" 
     } 
    }, 
    { "$unwind": "$resultingStudyGroupsArray" }, 
    { 
     "$group": { 
     "_id": null, 
     "myStudyGroups": { "$addToSet": "$resultingStudyGroupsArray" }, 
     "count": { "$sum": 1 } 
     } 
    } ]).exec(function(err, results){ 
    console.log(results); 
    return res.json({ studyGroups: results }); }); } 
0

ich es geschafft, alle guid ‚s aus dem Modell Benutzer ohne Aggregat mit zu holen.

export function getUserStudyGroups(req, res) { 
    User.findOne({ cuid: req.params.cuid }).select('studyGroups').exec((err, studyGroups) => { 
    if (err) { 
     return res.status(500).send(err); 
    } 
    console.log(studyGroups) 
    StudyGroup.find({ guid: {$in: studyGroups.studyGroups }}).exec((err, foundGroups) => { 
     if (err) { 
     return res.status(500).send(err); 
     } 
     return res.json({ myGroups: foundGroups }); 
     }); 
    }); 
} 

User und Forshungsgruppe ihrer nach Modell beziehen, und studyGroups.studyGroups gibt ein Array von Strings (die guid ‚s)