sql >> データベース >  >> NoSQL >> MongoDB

MongoDB:集計を使用して値の傾向を検出する方法はありますか?

    大まかな概要:10分間の平均を計算します:

    > var avgCursor = db.sensor_readings.aggregate([
        { "$match" : { "created_at" : { "$gt" : ten_minutes_ago, "$lte" : now } } }
        { "$group" : { "_id" : 0, "average" : { "$avg" : "$value" } } }
    ]}
    > var avgDoc = avgCursor.toArray()[0]
    > avgDoc
    { "_id" : 0, "average" : 23 }
    

    次に、それを別のコレクションに保存します:

    > db.sensor_averages.insert({ "start" : ten_minutes_ago, "end" : now, "average" : avgDoc.average })
    

    最後に、差を計算するために必要な2つの平均を思い出して、計算します。

    > var diffCursor = db.sensor_averages.find({ "start" : { "$gte" : twenty_minutes_ago } }).sort({ "start" : -1 })
    > var diffArray = diffCursor.toArray()
    > var difference = diffArray[0].average - diffArray[1].average
    

    定期的な集計をスキップして、代わりにsensor_averagesで移動平均を更新し続けることもできます。 、10分ごとに新しいドキュメントにジャンプします。各10分間の開始時に、sensor_averagesに挿入します ドキュメント

    {
        "start" : now,
        "svalues" : 0,
        "nvalues" : 0
    }
    

    次に、sensor_readingを挿入するたびに 次の10分間のドキュメント、sensor_averagesも更新します doc:

    db.sensor_averages.update(
        { "start" : now_rounded_to_the_ten_minute_boundary },
        { "$inc" : { "svalues" : value, "nvalues" : 1 } }
    )
    

    次に、平均値の差が必要な場合は、適切な2つのドキュメントを思い出して、svaluesを除算します。 nvaluesによる 平均を取得し、減算します。



    1. Mac上のmongodbデータベースの場所

    2. NoSQLデータベースの戦い-MongoDBとCouchDBの比較

    3. MongoDB範囲クエリでの$ltと$gtの順序

    4. Redis管理パネル