2016-08-26 19 views
1

私のアプリは、毎日さまざまなサイズのウェブページのスクリーンショットを取ります。ページとスクリーンサイズはジョブに設定されています。各ジョブは、キャプチャするページの配列と、それらの各ページをキャプチャするスクリーンサイズのリストを指定します。MongoDBの一致条件の最初の項目を選択

アプリが起動するたびに、毎日のスクリーンショットをまだ撮っていない場合に備えて、自動的にアクティブなジョブごとにすべてのスクリーンショットが再度取り込まれます。つまり、同じ仕事、ページ、スクリーンサイズのスクリーンショットを同じ日に2回以上表示することができます。

スクリーンショットを表示するときは、同じjob,page、およびscreensizeのプロパティを1回だけ返すことができます。これを行うには、毎日実行されるクエリを作成し、その日に複数回のショットがあるかどうかを確認する必要があります。存在する場合は、最初にdateTakenプロパティを持つもののみを返します。

これには$groupを使用する必要があるかどうかわかりません。私は$groupでいくつかの異なるクエリを試しましたが、すべてのショットを1つの結果にまとめたり、撮影日に関係なくすべてのスクリーンショットを返しました。

ここでは、スクリーンショットスキーマです:要するに

const ScreenshotSchema = new Schema({ 
    job: { 
     type: Schema.Types.ObjectId, 
     ref: 'Job', 
     required: true 
    }, 
    dateTaken: { 
     type: Date, 
     required: true 
    }, 
    page: { 
     type: Schema.Types.ObjectId, 
     ref: 'Page', 
     required: true 
    }, 
    screensize: { 
     type: Schema.Types.ObjectId, 
     ref: 'Screensize', 
     required: true 
    } 
}); 

は私が必要なものは、次のとおりです。仕事ページ画面サイズ日のユニークな組み合わせごとに1つの項目

答えて

1

Iグループ化は正しいアプローチだと考えてください。グループごとに最新のショットを取ります。それだけで私はちょうどそれを試みたが、それは画面サイズ、ページおよびジョブによってユニークな値になるんが、

db.collectionname.aggregate(
    [ 
    { 
     "$sort" : { "dateTaken" : -1 } 
    }, 
    { 
     "$group" : { 
     "_id": { 
      job:"$job", 
      page: "$page", 
      screensize: "$screensize", 
      year: { "$year" : "$dateTaken"}, 
      month: { "$month" : "$dateTaken" }, 
      dayOfMonth: { "$dayOfMonth" : "$dateTaken"} 
     }, 
     "shot": { "$first" : "$$ROOT" } 
     } 
    } 
    ] 
) 
+0

:これは、その後$firstオペレータと最新ショットを選ぶ、$group前降順$sortを使用することによって達成することができますユニークな組み合わせごとに1つの結果が返されますが、ユニークな組み合わせにつき1日*が必要です。 – Aron

+0

こんにちはアロン、私は一日ごとにグループ化するためのグループ化キーを追加しました。 –

+0

はい、それはうまくいくようです!今、 '.find({}) 'のようにScreenshotドキュメントのリストを取得するための方法はありますか?) 'shot'オブジェクトをラップするドキュメントを取り除くために後処理を追加する必要はありません – Aron

関連する問題