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