7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

時系列データベースとしてのMongoDB

Last updated at Posted at 2025-12-10

はじめに

「ともにつくる、つぎをつくる。~いつでもどこでもお客様とともに~ グローバルトップのソリューションパートナー」東芝テック株式会社の加藤秀幸です。現在、リテール・ソリューション事業本部、ELERA™プラットフォーム開発部にてPOSシステムの開発を行っています。今回はMongoDBに関する話を投稿したいと思います。

時系列データベースとは

時系列データベースの概要や比較は @kanegoon の記事をご参照ください

この時点ではMongoDBは時系列データベースとしての機能はなかっため上記比較リストには上げられていません。現在では比較対象のデータベースのひとつになるでしょう。

時系列データベースとしてのMongoDB

実際には時系列データベースというより時系列コレクションになります。この機能は2021/07リリースのMongoDB v5.0より導入されました。
これにより、IoTデータ、金融データ、アプリケーションメトリクスなど、多様な時系列データに対応でき、それに特化した内部構造により、従来のコレクションと比べてストレージ効率とクエリ性能が向上しています。

利用例

今回は個人的な趣味と実益のために確認・導入したことについて記載していきます。

家庭での利用なのでパフォーマンス等の評価は行っていません。あくまでも「やってみた」レベルです。

温湿度データの保存

温湿度は代表的なセンサーIoTデータの一つになると思います。私は室内の温湿度を肌の感覚で感じるのも良いですが、実データとして把握したいタイプなので家にはいくつか温湿度センサーを設置しています。しばらく運用していませんでしたが、過去にはMRTGにて温度収集をしていました。今回、これをMongoDBの時系列コレクションに保存したいと思います。

技術スタック

実際に利用した技術スタックは下記の様になります。

  • MongoDB Atlas M0 (Free Cluster)
    • 機能制限はありますが、評価・学習やこの様なホビーユースでは無料で使えます。
    • MongoDB Atlas自体にChartsという可視化ツールがついてきますが、今のところイマイチ感があります。よって他のツールで可視化するのが良さそうです。
    • 後述するデータはBSONで150byte程度なので150x12回x24時間x365日x5年=約75MBになり、Free Clusterの最大ストレージサイズが512MBなのセンサー5個を5年程度は保持できる計算になります。
  • Python
    • 温湿度データをMongoDBに保存するためのロジックに今回利用した言語です。
    • 私はセンサーとしてSwitchBotを利用しているためデータはすでにクラウド上にありAPIで取得できます。よって運用を楽にするためにも、AWS Lambda + EventBridge で稼働させています。USBやGPIOなどのセンサーの場合は実行環境はラズパイ等が良いでしょう。
    • ちなみに今のところArm/Graviton2にて5秒間隔でデータ取得と保存処理を実行していますがAWS無料枠に収まっています。
  • Grafana Cloud Free
    • 先述の通りMongoDBに保存したところで可視化できないと意味がないです。
    • こちらも機能制限はありますが、無料で利用できます。
    • 上記の機能制限に書かれた"14 days retention"はGrafana標準のPrometheusに時系列データを保存する場合の話で、今回のMongoDBの様な外部データソースを利用する場合はこの制限がありません。

全部、無料の範囲で評価・運用ができます。やったね!

Pythonを使った時系列コレクションへの保存

ほとんど、公式のチュートリアルと変わり映えがしませんが書いていきます。あくまでもサンプルコードです。実運用するにはちゃんとエラーハンドリングを入れましょう。

PyMongoを接続ドライバとして利用しますのでpipによりインストールされていることが前提です。

コレクションの初期化・時系列化

from pymongo import MongoClient


# 払い出したMongoDBのコネクションストリング(ローカルなMongoDBでもOKです)
MONGODB_URL="mongodb+srv://username:password@cluster0.xxxxx.mongodb.net/?appName=Cluster0"

# 時系列コレクションを作成するためのオプション設定
TIMESERIES_OPTIONS = {
    "timeField": "timestamp",   # 時系列コレクションの時間フィールド
    "metaField": "device_id",   # メタデータとしてセンサーデバイスのIDを格納するフィールド
    "granularity": "seconds",   # データの粒度(秒単位)
}

# TTLは5年としてみます。時系列コレクションを作成する際に使用
TTL_SECONDS = 5 * 365 * 24 * 3600

# MongoDBクライアントの作成
client = MongoClient(MONGODB_URL)

# データベースの取得
database = client.get_database("my_timeseries_db")

# 時系列コレクションの作成
collection = database.create_collection(
    "sensor_data",                      # 時系列コレクションの名前
    timeseries=TIMESERIES_OPTIONS,      # 上記時系列オプションの指定
    expireAfterSeconds=TTL_SECONDS      # 上記TTLの指定
)

上記方法で、コレクションを作成すると、MongoDB AtlasのWebUIやMongoDB CompassでのUIから見た場合、通常コレクションのフォルダアイコンから時系列グラフのアイコンに変わり、時系列コレクションとして設定されたことがわかります。

atlas1.png

センサーデータの挿入

温湿度センサーのデータはサンプルのためベタ書きです。実際にはデバイスから取得した値に置き換えてください。

from datetime import datetime, timezone


# ダミーデータ:実際はデバイスより取得してください
temperature = 25.3                      # 温度センサーの値
humidity = 60.5                         # 湿度センサーの値
device_id = "sensor_001"                # センサーデバイスのID
timestamp = datetime.now(timezone.utc)  # 現在のUTC時刻

# 時系列コレクション取得
collection = database.get_collection("sensor_data")

# ドキュメント(時系列データ)の作成
doc = {
    "timestamp": timestamp,
    "temperature": temperature,
    "humidity": humidity,
    "metadata": {"device_id": device_id},
}

# ドキュメント(時系列データ)の挿入
collection.insert_one(doc)

これで、MongoDB AtlasのWebUIあるいはMongoDB Compass等で見ると次の様にデータが挿入されていることがわかります(もちろんmongoshからfindでも良いでしょう)。

atlas2.png

可視化

今回は時系列データベースとしてのMongoDBの話なので、GrafanaからMongoDBへのJavaScriptによるクエリーに関しては省略します。こちらを設定することにより次の様な可視化ダッシュボードを作成することができます。

grafana.png

まとめ

上記の様な手順でMongoDBを時系列データベース(コレクション)として活用できることがわかりました。ホビーユース・評価確認レベルなら無料での運用もできています。

なお、製品・サービスとしてプロダクションレベルで利用する場合はパフォーマンスの評価や運用の検証を行いましょう。運用での信頼性、バックアップ機能、ネットワークピアリングなどを考えると有償のクラスタになるかと思います。

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?