iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
1

上次我們在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的聚合


上一篇
DAY27 mongo aggregate
下一篇
DAY29 平均資料POST上汶萊平台
系列文
初學者也能實做的環控系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言