db.getCollection('products').aggregate([ {$match : {"_id": ObjectId("5c4a08a1fdb8bb16d8afecdf")}}, {$unwind: "$items"}, {$unwind: "$items.modules"}, {$unwind : "$items.modules.subjects"}, {$group : { _id : "$items.modules.subjects", "modules": {$addToSet : "$items.modules"} } } ]) // GOlang code +type CourseSubjects struct{ + SubjectId bson.ObjectId `bson:"_id" json:"subject_id"` + Modules []models.ProductModule `bson:"modules" json:"modules"` + SubjectName string `bson:"name" json:"name"` +} + func GetClassFilters(classId bson.ObjectId) (map[string]int, error) { // TODO: Get from redis if cached filtersMap := make(map[string]int) @@ -52,3 +61,27 @@ func GetClassFilters(classId bson.ObjectId) (map[string]int, error) { return filtersMap, nil } + + +// Function to get subjects from subjects tagged in module +func GetSubjectFilters(classId bson.ObjectId) ([]CourseSubjects, error){ + keyModules := strings.Join([]string{models.KEY_PRODUCT_ITEMS, models.KEY_PRODUCT_ITEM_MODULES}, ",") + keyModulesSubjects := strings.Join([]string{models.KEY_PRODUCT_ITEMS, models.KEY_PRODUCT_ITEM_MODULES, models.KEY_MODULE_SUBJECTS}, ",") + pipe := []bson.M{ + bson.M{mongo.MONGO_KEYWORD_MATCH: bson.M{models.KEY_PRODUCT_ID: classId}}, + bson.M{mongo.MONGO_KEYWORD_UNWIND : models.KEY_PRODUCT_ITEMS}, + bson.M{mongo.MONGO_KEYWORD_UNWIND: keyModules}, + bson.M{mongo.MONGO_KEYWORD_UNWIND: keyModulesSubjects}, + bson.M{ + mongo.MONGO_KEYWORD_GROUP: bson.M{ + mongo.MONGO_KEY_ID: keyModulesSubjects, + "modules": bson.M{mongo.MONGO_KEYWORD_ADDTOSET: mongo.MONGO_KEY_VAR_PREFIX + keyModules}, + }, + }, + } + + productsCol := models.GetProductCollection() + var result []CourseSubjects + err := mongowrapper.PipeAllDoc(productsCol, pipe, &result) + return result, err +}