2

Please note I am a new coder.

I don't know how to story data efficiently in Mongo so I can re use it and compare over time.

I am building an admin dashboard where I am collecting data from HTML and storing in Mongo Collections and defined Schemas. The data is the converted into Graphs for the user to see.

Now, I am collecting data for this year. Next year, I will collect the exact or almost exact same data.

Then I want to create comparisons.

I initially I thought of creating SEVERAL models to differentiate.

so from my code below:

this years's model would be 2019manageSchema.... and next year's model would be 2020manageSchema... but the schemas would be exactly the same as I would be collecting the same data.

But I don't think this is the best practice.

Also, I'm thinking in the routes, it would be chaos to require all the mdoels and pass them through each route..

Mode

var mongoose = require("mongoose"),
    math     = require('mathjs');

*****DATABASE CONFIG*******
var manageSchema = new mongoose.Schema({
   period: String,
   managers: Number,
   staffs: Number,
   staffcosts: Number,
   headcountavg: Number,
   frontliners: Number,
   supportfunc: Number,
   depthratio: Number,
   totalrevenue: Number,
   grossprofit: Number,
   noofworkdays: Number,
   sickleavestaken: Number,
   unauthleavestaken: Number,
   authleavestaken: Number,
   eesmanagerscoreprev: Number,
   eesmanagerscore: Number,
   eesrecognitionscoreprev: Number,    
   eesrecognitionscore: Number,
    created: {type: Date, default: Date.now},
    user: {
      id: {
       type: mongoose.Schema.Types.ObjectId,
       ref: "User"
      },
     username: String
    }
});

module.exports = mongoose.model("Manage", manageSchema);

ROutes:


var express = require("express");
var router = express.Router();
var User        = require("../models/user");
var Manage = require ("../models/manages");

//Manage
    //Index Route for manage - view graphs + edit

router.get("/manage", isLoggedIn, function(req, res){
    Manage.find({}, function(err, manages){
        if(err){
            console.log("ERROR");
        } else {
            res.render("manage", {manages: manages});
        }
    });
});

    //NEW ROUTE - sends to forms page for Manage
router.get("/manage/new_admin0", isLoggedIn, function(req, res){
    res.render("manageForm");
});


    //CREATE ROUTE - POST request to manage
router.post("/manage", isLoggedIn, function (req, res){
    //create demog
    Manage.create(req.body.manage, function(err, newManage){
        if(err){
            console.log(err);
        } else {
            //add username and id to recruit
            newManage.user.id = req.user._id;
            newManage.user.username = req.user.username;
            //save recruit
            newManage.save();
             //redirect
             console.log(newManage);
            res.redirect("/manage");
        }
     });
 });

    //SHOW ROUTE - Specific info
router.get ("/manage/:id", checkOwnership, function(req, res){
    Manage.findById(req.params.id, function(err, foundManage){
        if(err){
            res.redirect("back");
        } else {
            res.render("showmanage", {manages: foundManage});
        }
    });
});

 // EDIT ROUTE - form to update existing data
router.get("/manage/:id/edit", checkOwnership, function(req, res){
        Manage.findById(req.params.id, function(err, foundManage){
                 res.render("editmanage", {manages: foundManage});               
        }); 
});

 //UPDATE ROUTE - use edit form info and update existing data
router.put("/manage/:id", checkOwnership, function(req, res){
    Manage.findByIdAndUpdate(req.params.id, req.body.manage, function(err, updateManage){
        if(err){
            res.redirect("back");
        } else {
          res.redirect("/manage/" + req.params.id);
        }
    });
});


 //middleware
function isLoggedIn(req, res, next){
    if(req.isAuthenticated()){
        return next();
    }
    res.redirect("/login");
}

function checkOwnership(req, res, next) {
    if(req.isAuthenticated()){
        Manage.findById(req.params.id, function(err, foundManage){
        if(err){
            res.redirect("back");
        } else {
            //check if user own data
            if(foundManage.user.id.equals(req.user._id)){
                 next();               
            } else {
                 res.redirect("back");
            }
          } 
        }); 
            } else {
                 res.redirect("back");
            }
}

module.exports = router;

Please help with the storing and ideally how to store without affecting the current routes.

Karen89
  • 21
  • 4

1 Answers1

0

You can group the data based on the date using MongoDB Aggregation Pipeline Operators like, $year, $month, $week

{
    $project: {
        month: { $month: "$created" },
        year: { $year: "$created" },
    }
},
{
    $group: {
        _id: {
            year: '$year',
            month: '$month'
        },
        count: {
            $sum: 1
        }
    }
}

Check out the reference link below that will help you build the query,

Şivā SankĂr
  • 1,966
  • 1
  • 18
  • 34