0

私は、さまざまなユーザーによって作成されたオブジェクトを持つmongoDBデータベースを持っています。今、ユーザーの保持とアクティブなユーザーを追跡するために、1週間に1回、新しいユーザーを作成したユーザーの数を調べる必要があります。先週のアクティブユーザー数をカウントしますか?

たとえば、オブジェクトが「Notes」であるとします。どのようにして、効果的な方法で、先週に何人のユーザーがメモを作成したかを数えますか?

注:

{ 
    "user_id" : "..." 
    "note" : "..." 
    "date" : "..." 
} 

私はマングースやNodeJSを使用しています。

答えて

1

コレクションが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"はパターンです。ここで最も重要なのは、各ステージで前のステージから出力されたデータのビューしか見ることができないということです。

これらの概念を取得したら、これは簡単です。

+0

うわー!この精巧な答えをありがとうございました!私は間違いなく集約にもっと見るだろう:) – Jolle

関連する問題