首页 > 解决方案 > 如何在MongoDB中存储和区分数据?

问题描述

请注意我是一个新的编码员。

我不知道如何在 Mongo 中有效地记录数据,因此我可以重复使用它并随着时间的推移进行比较。

我正在构建一个管理仪表板,我在其中从 HTML 收集数据并存储在 Mongo 集合和定义的模式中。数据被转换成图表供用户查看。

现在,我正在收集今年的数据。明年,我将收集完全相同或几乎完全相同的数据。

然后我想创建比较。

我最初想创建几个模型来区分。

所以从我下面的代码中:

今年的模型将是 2019manageSchema.... 明年的模型将是 2020manageSchema... 但模式将与我收集相同数据时完全相同。

但我认为这不是最佳做法。

另外,我在考虑路线,要求所有 mdoel 并通过每条路线传递它们会很混乱。

模式

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

路线:


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;

请帮助存储以及理想情况下如何存储而不影响当前路线。

标签: javascriptnode.jsmongodbexpressmongoose

解决方案


您可以使用MongoDB聚合管道运算符(如、、、、、 $year)根据日期对数据进行$month分组$week

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

查看下面的参考链接,这将帮助您构建查询,


推荐阅读