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

MongoDBグループと異なるドキュメントからの値の減算

    最初に必要なのは、条件付きの $sumです。 $condに基づく 各値のグループ化の演算子。次に、個別に $subtract

    db.gas.aggregate([
        { "$group": {
            "_id": "$timestamp",
            "gas-in": { 
                "$sum": { 
                    "$cond": [
                        { "$eq": [ "$sensor", "gas-in" ] },
                        "$value", 
                        0
                    ]
                }
            },
            "gas-out": { 
                "$sum": { 
                    "$cond": [
                        { "$eq": [ "$sensor", "gas-out"] },
                        "$value", 
                        0
                    ]
                }
            },
        }},
        { "$project": {
            "gasdifference": { "$subtract": [ "$gas-in", "$gas-out" ] }
        }}
    ])
    

    結果が得られます:

    { "_id" : ISODate("2015-09-17T21:20:35Z"), "gasdifference" : 5.5 }
    { "_id" : ISODate("2015-09-17T21:14:35Z"), "gasdifference" : 0.5 }
    

    別の方法は、単一ステージの「ガスアウト」値を負にすることです。

    db.gas.aggregate([
        { "$group": {
            "_id": "$timestamp",
            "gasdifference": { 
                "$sum": { 
                    "$cond": [
                        { "$eq": [ "$sensor", "gas-in" ] },
                        "$value", 
                        { "$subtract": [ 0, "$value" ] }
                    ]
                }
            }
        }}
    ])
    

    そして、それはより効率的になるでしょう。

    可能な「センサー」値が3つ以上ある場合は、$condを「ネスト」するだけです。 ステートメント:

    db.gas.aggregate([
        { "$group": {
            "_id": "$timestamp",
            "gasdifference": { 
                "$sum": { 
                    "$cond": [
                        { "$eq": [ "$sensor", "gas-in" ] },
                        "$value", 
                        { "$cond": [
                            { "$eq": [ "$sensor", "gas-out" ] },
                            { "$subtract": [ 0, "$value" ] },
                            0
                        ]}
                    ]
                }
            }
        }}
    ])
    

    これらは「三項」演算子(if-then-else)であるため、それ以降のロジックは「else」条件に含まれます。




    1. Atlas Free Cluster(MongoDB)への接続中にエラーが発生しました

    2. Mongodb c#ドライバーとISODate

    3. PHP54 + Nginx + PHPFPM+MongoDBでの持続的接続または接続プール

    4. Dockerコンテナで実行されているMongoDBに接続するにはどうすればよいですか?