コレクションがNote
という名前のモデルに取り付けられており、"date"
のデータが実際に有効Date
オブジェクトであることを仮定し、あなたは、本質的に与えられた日付と集計の間でのデータを照会:
// Work out days for start of tomorrow and one week before
const oneDay = 1000 * 60 * 60 * 24,
oneWeek = oneDay * 7;
const d = Date.now();
const lastDay = d - (d % oneDay) + oneDay;
const firstDay = lastDay - oneWeek;
// Run the aggregation
Note.aggregate([
// $match is a query to select the week
{ "$match": { "date": { "$gte": new Date(firstday), "$lt": new Date(lastDay) } },
// $group on the distinct users
{ "$group": { "_id": "$user_id" } },
// $group to count the total
{ "$group": { "_id": null, "count": { "$sum": 1 } } }
],function(err, results) {
// results in here
})
$match
他のMongoDBクエリステートメントとまったく同じ "クエリ"です。 $gte
と$lt
演算子を使用して、範囲内の値の範囲を表現します。これは、実際には、明示的に言葉を述べることなく、AND条件を書く簡略な方法です。
次の段階では、我々は_id
でグループ化キーに適用することによって、異なる 『値」としてフィールドデータ』「集合」に"user_id
を使用$group
ある。グルーピングキーの出力は常に一意である。
最終段これは「グループすべて」を意味する。この時間は、グループ化キーがnull
なく、現在のフィールド値を使用している別の$group
、あるので、我々は、値に$sum
操作を適用し、単一の行で終わります1
の「カウント」を実行する。
これは、各「ステージ」が次のステージに移動するときに、集約「パイプライン」が機能する方法です。 "Query" - > "Aggregate Distinct" - > "Aggregate Total"はパターンです。ここで最も重要なのは、各ステージで前のステージから出力されたデータのビューしか見ることができないということです。
これらの概念を取得したら、これは簡単です。
うわー!この精巧な答えをありがとうございました!私は間違いなく集約にもっと見るだろう:) – Jolle