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

mongodb集約フレームワークでのcase-statementの実行

    集約フレームワークの「case」SQLステートメントに対応するのは、$ cond演算子です(マニュアルを参照)。 $ condステートメントは、「when-then」と「else」をシミュレートするためにネストできますが、読みやすい(そして生成する、以下を参照)ため、別のアプローチを選択しました。$concat演算子を使用して記述します。範囲文字列。グループ化キーとして機能します。

    したがって、特定のコレクションの場合:

    db.xx.find()
    { "_id" : ObjectId("514919fb23700b41723f94dc"), "name" : "A", "timespent" : 100 }
    { "_id" : ObjectId("514919fb23700b41723f94dd"), "name" : "B", "timespent" : 200 }
    { "_id" : ObjectId("514919fb23700b41723f94de"), "name" : "C", "timespent" : 300 }
    { "_id" : ObjectId("514919fb23700b41723f94df"), "name" : "D", "timespent" : 400 }
    { "_id" : ObjectId("514919fb23700b41723f94e0"), "name" : "E", "timespent" : 500 }
    

    集約(ハードコードされた)は次のようになります:

    db.xx.aggregate([
      { $project: {
        "_id": 0,
        "range": {
          $concat: [{
            $cond: [ { $lte: ["$timespent", 250] }, "range 0-250", "" ]
          }, {
            $cond: [ { $and: [
              { $gte: ["$timespent", 251] }, 
              { $lt:  ["$timespent", 450] } 
            ] }, "range 251-450", "" ]
          }, {
            $cond: [ { $and: [
              { $gte: ["$timespent", 451] }, 
              { $lt:  ["$timespent", 650] } 
            ] }, "range 450-650", "" ]
          }]
        }
      }},
      { $group: { _id: "$range", count: { $sum: 1 } } },
      { $sort: { "_id": 1 } },
    ]);
    

    結果は次のとおりです。

    {
        "result" : [
            {
                "_id" : "range 0-250",
                "count" : 2
            },
            {
                "_id" : "range 251-450",
                "count" : 2
            },
            {
                "_id" : "range 450-650",
                "count" : 1
            }
        ],
        "ok" : 1
    }
    

    集約コマンドを生成するには、「範囲」プロジェクションをJSONオブジェクトとして構築する必要があります(または、文字列を生成してからJSON.parse(string)を使用することもできます)

    ジェネレータは次のようになります:

    var ranges = [ 0, 250, 450, 650 ];
    var rangeProj = {
      "$concat": []
    };
    
    for (i = 1; i < ranges.length; i++) {
      rangeProj.$concat.push({
        $cond: {
          if: {
            $and: [{
              $gte: [ "$timespent", ranges[i-1] ]
            }, {
              $lt: [ "$timespent", ranges[i] ]
            }]
          },
          then: "range " + ranges[i-1] + "-" + ranges[i],
          else: ""
        }
      })
    }
    
    db.xx.aggregate([{
      $project: { "_id": 0, "range": rangeProj }
    }, {
      $group: { _id: "$range", count: { $sum: 1 } }
    }, {
      $sort: { "_id": 1 }
    }]);
    

    上記と同じ結果が返されます。



    1. セロリはタスクごとに新しい接続を作成します

    2. いつ実際に使用するのか、Redis lua?

    3. mongoexport E QUERY SyntaxError:予期しない識別子

    4. Django ValueError:パス'ws /chat//'のルートが見つかりません