Как хранить и дифференцировать данные в MongoDB? - PullRequest
0 голосов
/ 31 января 2019

Обратите внимание, я новый кодер.

Я не знаю, как эффективно создавать данные в Монго, поэтому я могу использовать их и сравнивать с течением времени.

Я создаю панель администратора, где собираю данные из HTML и храню в коллекциях Mongo и определенных схемах.Данные преобразуются в графики для просмотра пользователем.

Теперь я собираю данные за этот год.В следующем году я соберу точные или почти точные данные.

Тогда я хочу создать сравнения.

Я изначально думал о создании НЕСКОЛЬКИХ моделей для дифференциации.

так из моего кода ниже:

модель этого года будет 2019manageSchema .... а модель следующего года будет 2020manageSchema ... но схемы будут точно такими же, как и ясобирать те же данные.

Но я не думаю, что это лучшая практика.

Кроме того, я думаю, что на маршрутах было бы хаосом требовать, чтобы все mdoels проходили через каждый маршрут..

Режим

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;

Пожалуйста, помогите с хранением и в идеале, как хранить без влияния на текущие маршруты.

1 Ответ

0 голосов
/ 31 января 2019

Вы можете сгруппировать данные на основе даты, используя MongoDB Операторы агрегации трубопроводов, такие как, $year, $month, $week

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

Проверьте ссылку ссылкиниже это поможет вам построить запрос,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...