1。BASICDBOBJECT
集約クエリ全体は、ユーザーのさまざまな状態のユーザーの数をシナリオとしてカウントすることです。
1。フィルター基準:
日付はクエリ日です:
BASICDBOBJECT query = new BasicDBoBject(); query.put( "time"、new BasicDbobject( "$ gte"、date + "00:00:00").append( "$ lte"、date + "23:59:59"));
複数の条件がある場合:query.put( "status"、0)を追加します。
ある場合またはフィルター:
BasicDblist値= new BasicDblist(); values.add(new BasicDboBject( "status"、new BasicDboBject( "$ exists"、false))); values.add(new BasicDboBject( "Status"、0)); query.put( "$ or"、values);
新しいBasicDboBject( "$ Existes"、false))が「ステータス」が存在しないことを意味します(MongoDBドキュメントはエンティティフィールドと等しくなりません)
2。スプライシングマッチ
dbobject match = new BasicDboBject( "$ match"、query);
前のクエリをMacthフィルターに入れます
3。スプライシングおよびグループ化条件
このステップは、SQLグループに相当します
BASICDBOBJECT GROUPBY = NEW BASICDBOBJECT(); // GroupBy.put( "userid"、 "$ userid"); //ユーザーIDによるグループのグループ化
最初のステップのフィルタリングステップと同様に、複数のグループがある場合、次のグループに直接追加できます。GroupBy.put( "status"、 "$ status");
4。グループ後クエリ
最初にグループ化をスプライスします:
dbobject select = new BasicDboBject( "_ id"、groupby);
グループ化されたデータで動作したい場合:(ここにユーザーの統計があります)
select.put( "count"、new BasicDboBject( "$ sum"、1));
5。Splice$グループ
dbobject group = new BasicDboBject( "$ group"、select);
これまでのところ。ここでMongodbステートメントをスプライスしましょう
クエリ操作を開始しましょう:
com.mongodb.aggregationoutput; import org.springframework.data.mongodb.core.mongotemplate; aggregationoutput output = mongotemplate.getCollection( "Mongodbのデータテーブル名").Aggregate(一致、グループ);
クエリの結果を読む:
iterable <dbobject> map = output.Results(); // transip mapfor(dbobject dbobject:map){//ここで読み取るマップは{"_id":{"userid":1、 "}}}} ... map <string、object> resultmap =(map <string、object>) //TRANSFER.0 INTEGER USERID = INTEGER.PARSEINT(commutil.tostring(ausgmap.get( "userid"))。 //ここでは、データを操作できます。 integer count = integer.parseint(commutil.tostring(dbobject.get( "count"))); }2。DBObject
これ以上苦労せずに、最初の方法が特に長期的であると思われる場合は、より簡潔なコードを使用して、より簡潔な集約クエリをお届けします。
コードをアップロードするだけです。
1。インポートされたパッケージに注意してください:
com.mongodb.dbobjectをインポートします。 com.mongodb.util.jsonをインポートします。
2. $ macth:
(Beginday-query開始日、終了日の終了日)
dbobject match =(dbobject)json.parse( "{$ mate:{'status': '1'、 'time':{$ gte: '"+beginday+"'、$ lte: '"+endday+"'}}}");3. $グループ:
(UserIDによってグループ化され、ユーザー数を数え、Amoutフィールド値を蓄積し、Amoutフィールドの最大値を取得します)
dbobject group =(dbobject)json.parse( "{$ group:{_ id: '$ userid'、count:{$ sum:1}、total:{$ sum: '$ lument'}、maxsigle:{$ max: '$ ant'}}}}");条件がスプライスされたら、クエリを開始します。
List <DBOBJECT> list = new ArrayList <DBOBICT>(); list.add(mate); list.add(group); aggregationoutput output = mongotemplate.getCollection( "table name")。aggregate(list);
横断結果について話す必要はありません。上記は詳細に説明されています
2番目の方法は他の方法よりもはるかに単純ですか?しかし、それはMongoDBステートメントに精通していることをテストします。
【拡張】
その後、上記の方法が拡大します
//ステータスは0または1です。 not 11を入力します。 Time dbobject match =(dbobject)json.parse( "{$ mate:{'status':{'status':{$ in:['0'、 '1']}、type:{$ ne:11}、 'time':{$ gte: '+beginday+"'、$ lte: '+endday+"最後にdbobject group =(dbobject)json.parse( "{$ group:{_ id: '$ userid'、count:{$ sum:1}、lasttime:{$ max: '$ time'}}}"); json.parse( "{$ match:{count:{$ gte:100}}}"); // $ project ----クエリ結果に表示するフィールドは1に設定され、_idフィールド(フィールド)は次のように表示する必要はないので、次のように指定する必要があります。 collection name.aggregate([{$ project:{_id:0、count:1、lastsucctime:1}}])dbobject project =(dbobject)json.parse( "{$ project:{_ id:1、count:1、lastsucctime:1}}"); JSON.parse("{$sort:{'count':-1}}");//Sorting List<DBObject> list = new ArrayList<DBObject>();list.add(match);list.add(group);list.add(groupMatch);list.add(project);list.add(sort);AggregationOutput catchOutPut = mongotemplate.getCollection( "table name").aggregate(list); // query results3。BASICDBOBJECT+スクリプトステートメント
BASICDBOBJECT GROUPINDEX = NEW BASICDBOBJECT(); BASICDBOBJECT DISCTIONQUERY = NEW BASICDBOBICT(); DISCTIONQUERY.PUT( "USERID"、new BasicDboBject( "$ in"、userIds)); database.prevのデータはクエリ結果を表します// prev.countここでのカウントは、前のステップinitindexのカウントですinitindex)string resud = "function(doc、prev){if(doc.status == 0){prev.count+= 1;} getCollection( "collection")。group(groupindex、distictquery、initindex、reduce、null);最後に、リストをループすることで結果を取得できます。 [PS:グループのこの集約方法に制限があります---> 20,000データを超えるとエラーが発生します]
上記は、通常のビジネス処理でMongoDB集約処理を使用するものです。より良い方法や改善が必要なものがある場合は、私にメッセージを残してください〜