DAY28 mongodb aggregate(2)

上次我们在mongo shell里使用mongodb aggregate 不过 我们需要在程序里面去取得资料库资料 才能轻松的放上网站 在node js里面使用mongodb aggregate 的方法跟mongodb一样 不过因为js的特性的关系 我们的function需要变成非同步

var MongoClient=require('mongodb').MongoClient

MongoClient.connect("mongodb://127.0.0.1:27017/test", function(err,client){
    if(err){
        console.log(err);
        console.log('connecting fail');
        return;
    }
    console.log('connecting');
    let udate = new Date();
    let nowtime = udate.toLocaleString('zh-hant', { timeZone: 'Asia/Taipei' })
    var db_client = client.db('data_test')
    var db_table = db_client.collection('data')
db_client.collection('data',async function(err,collection){
const getCO2Avg = await collection.aggregate([
        { $match: {'time': {$gt: '9/22/2020, 00:00:00 PM', $lt:'9/23/2020, 00:00:00 PM'},'name':'CO2' } },
        {
          $group: {
            _id: "$name",
            avg: {
              $avg: "$data" // in the dataset, each doc has a value field which equals a number
            }
          }
        }
      ]).toArray();
      const getTVOCAvg = await collection.aggregate([
        { $match: {'time': {$gt: '9/22/2020, 00:00:00 PM', $lt:'9/23/2020, 00:00:00 PM'},'name':'TVOC' } },
        {
          $group: {
            _id: "$name",
            avg: {
              $avg: "$data" // in the dataset, each doc has a value field which equals a number
            }
          }
        }
      ]).toArray();
      console.log(getCO2Avg);
      console.log(getTVOCAvg);
        });
  })

从这段程序可以看到 我们连接资料库的函式前面多加了 Async 这是因为我们 aggregate 在搜寻资料的时候需要时间 但是js的特性就是所有程序都会同时执行不会去等待某一行跑完
如果这时我们在这些需要时间等待的函数前面不加 await 他就会来不及执行完 导致报错或是回传奇怪的值
而我们await需要在非同步(Async)的函式里才能使用
然後接下来就是mongo db 里的搜寻式 包含 $match : 寻找符合的资料 $group 指的是我们输出的格式 包含我们要输出的内容 跟名称
执行的结果如下

我们也可以去mongo shell里面搜寻看看我们得到的值是不是正确的

确认值一样代表我们得到的数值是正确的 就完成了取得平均值的功能
再来我们只把值取出来 可以看到 我们那一大串资料[ { _id: 'CO2', avg: 320.48275862068965 } ]
是一个阵列 所以我们要拿到资料只需要用

console.log(getCO2Avg[0].avg);
console.log(getTVOCAvg[0].avg);


今天教了在node js 里使用聚合方法去计算我们资料的平均值 一开始我去学如何使用聚合的时候花了很久 因为不知道要用非同步的方式 网路上也没有适合的教学 不过想通了就学很快 写这篇教学也是希望可以用比较简单的方式跟别人讲解如何使用mongodb的聚合


<<:  MySQL 群组函数之基本操作

>>:  RxJS 工具类型 Operators (1) - tap / toArray / delay / delayWhen

ISO 27001 资讯安全管理系统 【解析】(七)

(五)员工 我们目前拥有多名员工,分别是管理阶层、软件开发、硬体维护、营业部门、客户管理及财务和管理...

Day14 上上下下左左右右 & 世代差异的沟通术

如果你看到标题秒懂而且联想到梁家辉的话,我只能说,你一定是一个擅长沟通的好PM。 谈到团队内沟通,跟...

Day 11 ( 中级 ) 视差效果

视差效果 教学原文参考:视差效果 这篇文章会介绍,如何在 Scratch 3 里建立五个角色,透过重...

Day27 Flutter—BLoC介绍

BLoC BLoC全称为 Business Logic Component,表示为业务逻辑组件。是独...

每个人都该学的30个Python技巧|技巧 30:档案操作(字幕、衬乐、练习)

今天!就是今天!!这个系列终於要完结啦~(撒花)(狂撒) 最後一个要教的技巧就是关於档案操作,如果想...