必要なのは、 $cond です。 $ and 。しかし、これはあなたが望むものを正確に与えるはずです。
db.collection.aggregate([
{"$group": {
"_id": {"$cond": [
{"$gte": ["$LoadTime", 2000] },
"Slowest", // return "Slowest" where true
{"$cond": [
{"$and": [
{"$lt": ["$LoadTime", 2000] },
{"$gte": ["$LoadTime", 1000] }
]},
"Slow", // then "Slow" here where true
{"$cond": [
{"$and": [
{"$lt": ["$LoadTime", 1000] },
{"$gte": ["$LoadTime", 500 ] }
]},
"Medium", // then "Medium" where true
"Fast" // and finally "Fast" < 500
]}
]}
]},
"count": {"$sum": 1}
}},
{"$sort": { "count": 1 }}
])
あなたの時間は全体なので ミリ秒で、私が編集を要求した理由がわかります。
つまり、 $ cond ternary 演算子、次の3つの引数を取ります:
- booleanを返すかどうかを評価する条件
- 条件がtrueの場合の戻り値
- 条件がfalseの場合の戻り値
したがって、アイデアはあなたがネストすることです 全体の条件、次へ falseでテストする 一致する条件と返される値が見つかるまで。
$と 一部は条件の配列です 含める。これにより、範囲が得られます 。したがって、最も長い部分で:
{"$cond": [ // Evaluate here
{"$and": [ // Within the range of the next 2
{"$lt": ["$LoadTime", 2000] },
{"$gte": ["$LoadTime", 1000] }
]},
"Slow", // true condition - return
{"$cond": [ // false - move to next eval
あなたをカスケードすることはtimes
の間「速い」ままにされます 500ミリ秒未満。
これらの各keys
グループに発行され、{ $sum: 1 }
グループ化されたカウントを取得します。
独自の言語実装でそれが必要な場合は、pipeline
全体
は単なるJSONであるため、手動で翻訳するのが難しい場合、または私のように怠惰な場合は、それをネイティブデータ構造に解析できます。
編集
コメントのため フォームを説明する必要があるようです 提示されたクエリの。したがって、ここで明確にするための編集補遺を示します。
学習時 集約パイプラインの使用、そして確かにグッドプラクティス 書き出しとテストのために 複雑な一連のステージまたはロジックであるため、視覚化すると便利です。 パーツを一度に1ステップ実装することによる結果 。だから、そのようなことを書く場合、私の最初 手順は次のようになります:
db.collection.aggregate([
{"$group": {
"_id": {"$cond": [
{"$gte": ["$LoadTime", 2000] },
"Slowest",
null
]}
}}
])
これで、予想どおりに「最も遅い」のカウントが得られ、次にバケット 他のすべてをnull
に 。ですから、これまでの結果を見る段階があります。ただし、テストの場合 チェーンを構築する前に、実際にこのようなことをします:
db.collection.aggregate([
{"$group": {
"_id": {"$cond": [
{"$and": [
{"$lt": ["$LoadTime", 2000] },
{"$gte": ["$LoadTime", 1000] }
]},
"Slow",
null
]}
}}
])
だから私は「遅い」(間)の結果を取得しています 2000および1000)他のすべてがnull
にある場合 バケツ。したがって、私の全体的な数は同じままです。
決勝で 指摘されたように、 ternary
このようにネストされた条件、最初 ステージにはすでにあります false
を評価しました 次へでテストされているアイテムの場合 オペレーター。これは、それらがないことを意味します より大きい 最初のですでにテストされた値 ステージ、そしてそれはその状態をテストする必要をなくすので、これはできた 次のように書く:
db.collection.aggregate([
{"$group": {
"_id": {"$cond": [
{"$gte": ["$LoadTime", 2000] }, // Caught everything over 2000
"Slowest",
{"$cond": [
{"$gte": ["$LoadTime", 1000] } // Catch things still over 1000
"Slow",
{"$cond": [ // Things under 1000 go here
// and so on
そして、その短絡 本物がないための評価 次の論理的条件に到達しないものをテストする必要があります。
したがって、純粋に 視覚的な理由 カットアンドペーストの完全な怠惰のために ロジックでは、$とを使用して拡張フォームになります。 ラップする条件 範囲。しかし、慣れていない人のために ternaryの使用法
明確な視覚的手がかりがあります このフェーズで一致する結果は間になります 2000ms
の値 および1000ms
、など、各範囲の結果として必要なものです。
私が言ったように、ロジックがどのように機能するかのために持っている必要はありませんが、それは 開発フェーズであり、明確 まだ頭を悩ませていない人々に ternaryの使用法 その$condを形成します 提供します。