Tôi sử dụng mongodb 2.6. Tôi đã lưu trữ dữ liệu của tôi dưới hình thức này:Nhóm Theo tập hợp trên MongoDb
{
"_id" : "my-sensor-1",
"points": [
{ "timeStamp" : NumberLong("1453468362174"), "value" : 41 },
{ "timeStamp" : NumberLong("1453468483297"), "value" : 66 },
{ "timeStamp" : NumberLong("1453468485568"), "value" : 49 },
...
]
}
Để tổng hợp các tài liệu tôi làm cho các truy vấn như thế này:
db.pointsTest.aggregate([
{ $match: { $and: [ {"points.timeStamp" : { $gt : 1453433925163}},
{"_id":"my-sensor-10"} ] } },
{"$unwind":"$points"},
{$group: {_id: "my-sensor-1","average":{$avg : "$points.value"}}}
])
{ "_id": "my-cảm biến-1 ", "trung bình": 52}
quả
Tôi đã lưu dấu thời gian bằng mili giây nên mỗi lần tôi muốn tổng hợp một khoảng thời gian cụ thể, tôi phải thay đổi giới hạn của giá trị timeStamp.
Làm cách nào để tổng hợp trong một khoảng thời gian và nhóm kết quả theo khoảng cách khoảng thời gian (tức là tổng hợp giá trị trung bình từ bây giờ() -1day GROUP by 1h)?
EDIT
Tôi muốn làm một cái gì đó như thế này:
db.pointsTest.aggregate([
{ $match: { $and: [ {"points.timeStamp" : { $gt : 1453433925163, $lt : 1453555555555}}, {"_id":"my-sensor-10"} ] } }, {"$unwind":"$points"}, {$group: {_id: "my-sensor-1","average":{$avg : "$points.value"}, ???}}
])
và kết quả sẽ là mức trung bình của khoảng thời gian này được phân nhóm theo 1h. Giả sử rằng tôi muốn tổng hợp các giá trị trung bình cho mỗi giờ trong 31 Tháng Mười Hai:
dấu thời gian của khoảng thời gian 31/12/2015 20:00:00, trung bình: xyz
dấu thời gian của khoảng 31/12/2015 21:00:00, trung bình: xyz
Tại thời điểm này để đạt được điều đó tôi phải chia khoảng thời gian trong khoảng thời gian 1 giờ và thực hiện một số yêu cầu đến cơ sở dữ liệu.
IE sử dụng InfluxDB làm như vậy tôi làm điều này:
"SELECT MEAN(value) From myMeasures where key='my-sensor-1' and time > now() - 1d GROUP BY time(1h)"
thực sự hữu ích nhưng tôi nghĩ rằng nó thiếu một cái gì đó (có lẽ tôi đã không xác định nó trên câu hỏi của tôi). Để lặp lại các mục trong danh sách, tôi phải thêm một $ match khác vì khi điều kiện là true thì nó trả về toàn bộ các mục. Vì vậy, truy vấn giống như sau: db.pointsTest.aggregate ({$ match: {$ và: [{"points.timeStamp": {$ gte: 1453797806927}}, {"_id": "my-sensor-1"} ]}}, {$ giãn ra: "$ điểm"}, {$ match: {"points.timeStamp": {$ gte: 1453797806927}}}, {"$ group": {"_id": {"$ trừ" : ["$ points.timeStamp", {"$ mod": ["$ points.timeStamp", 1000 * 60]}]}, "trung bình": {"$ avg": "$ points.value"}}}) – bill