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

mongoaggregationを使用して異なるドキュメントの値の差を計算する方法は?

    原則として難しい質問ですが、2つのドキュメントを提示する単純化されたケースにとどまり、それを基にした解決策を示します。概念は抽象化する必要がありますが、拡張されたケースではより困難です。 集約フレームワーク で可能 一般的に:

    db.collection.aggregate([
        // Match the documents in a pair
        { "$match": {
            "timeMilliSec": { "$in": [ 1414590255, 1414590245 ] }
        }}
    
        // Trivial, just keeping an order
        { "$sort": { "timeMilliSec": -1 } },
    
        // Unwind the arrays
        { "$unwind": "$data" },
    
        // Group first and last
        { "$group": {
            "_id": "$data.name",
            "firstX": { "$first": "$data.x" },
            "lastX": { "$last": "$data.x" },
            "firstY": { "$first": "$data.y" },
            "lastY": { "$last": "$data.y" }
        }},
    
        // Difference on the keys
        { "$project": {
            "diff": {
                "$divide": [
                    { "$subtract": [ "$firstX", "$lastX" ] },
                    { "$subtract": [ "$firstY", "$lastY" ] }
                ]
            }
        }},
    
        // Not sure you want to take it this far
        { "$group": {
            "_id": null,
            "diffX": { 
                "$min": {
                    "$cond": [
                         { "$eq": [ "$_id", "X" ] },
                         "$diff",
                         false
                     ]
                }
            },
            "diffY": { 
                "$min": {
                    "$cond": [
                         { "$eq": [ "$_id", "Y" ] },
                         "$diff",
                         false
                     ]
                }
            }
        }}
    ])
    

    意図がわからないため、誇張されている可能性がありますが、サンプルに基づくこれの出力は次のようになります。

    { 
        "_id" : null, 
        "diffX" : 0.14285714285714285, 
        "diffY" : 0.6 
    }
    

    これは計算と一致します。

    あなたはあなたのケースに適応することができますが、一般的な原則は示されている通りです。

    最後の「パイプライン」段階では、結果を1つのドキュメントに結合するだけなので、少し「極端」になります。それ以外の場合、「X」と「Y」の結果はすでに2つで取得されています。 パイプライン内のドキュメント。主に $group $firstを使用した操作 および $last グループ化境界上のそれぞれの要素を見つけるための操作。

    $projectでの後続の操作 パイプラインステージは、明確な結果を決定するために必要な計算を実行します。 集計演算子 を参照してください 詳細については、特に $divide> および $subtract

    何をするにしても、このコースに従います。 2つのキーで「開始」と「終了」のペアを取得します。次に、計算を実行します。




    1. データベースとしてのNoSQL(MongoDB)とLucene(またはSolr)

    2. MongoDBでコレクションを作成中にエラーが発生しました

    3. JSONとしてシリアル化されたMongoDBオブジェクト

    4. LogicException:PHPRedis拡張機能がインストールされ有効になっていることを確認してください