1

皆さん、私のデータを照会する際に大きな問題があります。日ごとにハッシュタグの数をカウントし、例えば出)は、このような何かmongoとspring-data-mongoの集約クエリ

1:

{_id:"2016-12-13", 
hashtags:[ 
{hashtag:"asd",count:20}, 
{hashtag:"weila",count:18}, 
{hashtag:"asd2",count:10}, 
.... 
] 
} 

{_id:"2016-12-14", 
hashtags:[ 
{hashtag:"asd",count:18}, 
{hashtag:"asd2",count:14}, 
{hashtag:"weila",count:10}, 
.... 
] 
} 
を私はこのような文書があります。

{ 
    "_id" : NumberLong(999789748357864), 
    "text" : "#asd #weila #asd2 welcome in my house", 
    "date" : ISODate("2016-12-13T21:44:37.000Z"), 
    "dateString" : "2016-12-13", 
    "hashtags" : [ 
     "asd", 
     "weila", 
     "asd2" 
    ] 
} 

を、私は2つのクエリを構築したいです

2)別のものは同じですが、2016-12-13から2016-12-17までの期間を設定します。

最初のクエリでは、私はこのクエリを書いていますが、私は春のデータMongoで検索するものを取得します。書き方はわかりません。あなたはまだ二グループステージの後に同じ集計操作の割合を引いたパイプラインの手順を使用することができますが、フィルタリングの側面のために、あなたが最初の$matchパイプラインステップで日付範囲クエリを導入する必要があると思います

db.comment.aggregate([ 
{$unwind:"$hashtags"}, 
{"$group":{ 
    "_id":{ 
     "date" : "$dateString", 
     "hashtag": "$hashtags" 
    }, 
    "count":{"$sum":1} 
    } 
}, 
{"$group":{ 
    "_id": "$_id.date", 
    "hashtags": { 
     "$push": { 
     "hashtag": "$_id.hashtag", 
     "count": "$count" 
    }}, 
    "count": { "$sum": "$count" } 
}}, 
{"$sort": { count: -1}}, 
{"$unwind": "$hashtags"}, 
{"$sort": { "count": -1, "hashtags.count": -1}}, 
{"$group": { 
     "_id": "$_id", 
     "hashtags": { "$push": "$hashtags" }, 
     "count": { "$first": "$count" } 
    }}, 
{$project:{name:1,hashtags: { $slice: ["$hashtags", 2 ]}}} 
]); 

答えて

0

。あなたは、特定の日付範囲の凝集体をフィルタリングする方法を示し

次のmongoシェル例:

1)は、2016年12月13日から2016年12月14日までの期間を設定します。

var startDate = new Date("2016-12-13"); 
startDate.setHours(0,0,0,0); 

var endDate = new Date("2016-12-14"); 
endDate.setHours(23,59,59,999); 
var pipeline = [ 
    { 
     "$match": { 
      "date": { "$gte": startDate, "$lte": endDate } 
     } 
    } 
    { "$unwind": "$hashtags" }, 
    { 
     "$group": { 
      "_id": { 
       "date": "$dateString", 
       "hashtag": "$hashtags" 
      }, 
      "count": { "$sum": 1 } 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$_id.date", 
      "hashtags": { 
       "$push": { 
        "hashtag": "$_id.hashtag", 
        "count": "$count" 
       } 
      } 
     } 
    } 
] 
db.comment.aggregate(pipeline) 

2)2016年12月13日から2016年12月17日までの期間を設定します。

var startDate = new Date("2016-12-13"); 
startDate.setHours(0,0,0,0); 

var endDate = new Date("2016-12-17"); 
endDate.setHours(23,59,59,999); 
// run the same pipeline as above but with the date range query set as required 

春データ等価(未テスト):

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; 

Aggregation agg = newAggregation(
    match(Criteria.where("date").gte(startDate).lte(endDate)), 
    unwind("hashtags"), 
    group("dateString", "hashtags").count().as("count"), 
    group("_id.dateString") 
     .push(new BasicDBObject 
      ("hashtag", "$_id.hashtags").append 
      ("count", "$count") 
     ).as("hashtags") 
); 
AggregationResults<Comment> results = mongoTemplate.aggregate(agg, Comment.class); 
List<Comment> comments = results.getMappedResults(); 
+0

@chridamさんのお返事ありがとうございます。私は同じことを実現していますが、このソリューションでは毎日1つのクエリを実行する必要があります。ケース2では完璧です。 Spring Dataでハッシュタグ配列をスライスしてトップ10要素だけを取得する方法を知っていますか? mongoではカウントをソートした後にプロジェクションを行います。{$ project:{name:1、hashtags:{$ slice:["$ hashtags"、2]}}} 'しかし、私が使用するリリースでは$ sliceは実装されていません。私は内側の構造をソートし、それを制限する必要がありますが、春のデータmongo私はどのように行うかわからない、任意の提案? – dantavo

+0

集計クエリのグループの後にこの 'project(" name ")。(" hashtags ")プロジェクト(" slice "、2))を追加してください。 – Veeram

+0

@SagarReddyありがとうございました。結果は正しい。集計関数の2番目のグループステップの直前に限度(2)を置いていますが、私はあなたが私に甘えているものとこの命令を変更します;) – dantavo

関連する問題