さて、あなたはただ「補う」ことはできません。 $mode
としての演算子 は集計演算子ではなく、使用できるのは実際に存在する
。
したがって、最も発生するグループ化された期間内にカテゴリ値を返すには、最初にそれらの値のそれぞれをグループ化し、発生回数を返す必要があります。次に、これらの結果をそのカウントで並べ替えて、その期間内に最大のカウントを記録したカテゴリ値を返すことができます。
// Filter dates
{ "$match": {
"dt": {
"$gt": new Date("October 13, 2010 12:00:00"),
"$lt": new Date("November 13, 2010 12:00:00")
}
}},
// Group by hour and category, with avg and count
{ "$group": {
"_id": {
"dt": {
"$add": [
{
"$subtract": [
{ "$subtract": ["$dt", new Date(0)] },
{
"$mod": [
{ "$subtract": ["$dt", new Date(0)] },
3600000//1000 * 60 * 60
]
}
]
},
new Date(0)
]
},
"category": "$category"
},
"price": { "$avg": "$price" },
"count": { "$sum": 1 }
}},
// Sort on date and count
{ "$sort": { "_id.dt": 1, "count": -1 }},
// Group on just the date, keeping the avg and the first category
{ "$group": {
"_id": "$_id.dt",
"price": { "$avg": "$price"}
"category": { "$first": "$_id.category" }
}}
したがって、 $group
日付とカテゴリの両方で、$sum
。次に、 $sort
したがって、グループ化された各日付の最大の「カウント」が一番上になります。最後に、 $first
を使用します
別の$group
を適用する場合 これは、各日付のカウントが最大のカテゴリを返すために、日付自体に適用されるだけです。
$max
のような演算子に誘惑されないでください ここでは機能しないためです。主な違いは、カテゴリ値ごとに作成された「レコード/ドキュメント」との「結びつき」の関係です。したがって、必要な最大の「カウント」や最大の「カテゴリ」値ではなく、最大のカウントを「生成」したカテゴリ値です。したがって、$sort
があります ここで必要です。
最後に、あなたが「破るべき」いくつかの習慣:
-
何をしているのかを本当に理解していない限り、UTC形式以外の日付インスタンスデータを入力として使用しないでください。日付は常にUTCに変換されるため、少なくともテストリストでは、その方法で日付値を指定することに慣れておく必要があります。
-
他の方法では少しきれいに見えるかもしれませんが、
1000 * 60 * 60
のようなものです3600000
よりもはるかにわかりやすいコードです 。同じ値ですが、1つの形式は、時間単位が一目でわかることを示しています。 -
複利
_id
値が1つしかない場合も、問題を混乱させる可能性があります。したがって、_id.dt
にアクセスする意味はほとんどありません。 それが存在する唯一の値である場合。_id
内に複数のプロパティがある場合 それなら大丈夫です。ただし、単一の値は_id
に直接割り当てる必要があります 1人。他に何も得られず、シングルは非常に明確です。