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 values = new Basicdblist (); values.add (new Basicdbobject ( "상태", 새 basicdbobject ( "$ ensists", false))); values.add (new BasicdBobject ( "status", 0)); query.put ( "$ 또는", value);
새 basicdbobject ( "$ ensists", false))가 "상태"가 존재하지 않음을 의미합니다 (MongoDB 문서는 엔티티 필드와 동일 할 수 없습니다)
2. 스 플라이 싱 경기
dbobject match = new Basicdbobject ( "$ match", query);
이전 쿼리를 MACTH 필터에 넣으십시오
3. 스 플라이 싱 및 그룹화 조건
이 단계는 SQL 그룹과 동일합니다
BasicdBobject GroupBy = new BasicDBobject (); // 그룹화 조건 GroupBy.put ( "userId", "$ userId"); // groups us us us us us us groupby.put
첫 번째 단계의 필터링 단계와 마찬가지로 여러 그룹이있는 경우 다음에 직접 추가 할 수 있습니다. GroupBy.put ( "상태", "$ 상태");
4. 그룹 후 쿼리
첫 번째 스플 라이스 그룹 :
dbobject select = new Basicdbobject ( "_ id", GroupBy);
그룹화 된 데이터에서 작동하려면 : (사용자의 통계는 다음과 같습니다)
select.put ( "count", new Basicdbobject ( "$ sum", 1));
5. Splice $ Group
dbobject group = new Basicdbobject ( "$ group", select);
지금까지. Mongodb 진술을 여기서 말하자
쿼리 작업을 시작하겠습니다.
import com.mongodb.aggregationOutput; import org.springframework.data.mongodb.core.mongotemplate; AggregationOutput output = mongotemplate.getCollection ( "여기 MongoDB의 데이터 테이블 이름") .Aggregate (일치, 그룹);
쿼리 결과를 읽으십시오.
반복적 인 <dbobject> map = output.results (); // transip mapfor (dbobject dbobject : map) {// 여기에서 읽은 맵은 { "_id": { "userId": 1, "status"0}} ... map <string, object> resultmap = (map <string, object>) dbobject.get ( "vbject.get"); //transfer.0 integer userId = integer.parseint (commutil.toString (ausgmap.get ( "userId")). 대체 ( ". 0", ""); // 여기서 우리는 데이터에서 작동 할 수 있습니다. integer count = integer.parseint (commutil.tostring (dbobject.get ( "count"))); }2. dbobject
더 이상 고민하지 않으면 첫 번째 방법이 특히 장기적이라고 생각한다면보다 간결한 코드를 통해보다 간결한 집계 쿼리를 제공합니다.
코드를 업로드하십시오.
1. 수입 패키지에주의하십시오.
import com.mongodb.dbobject; import com.mongodb.util.json;
2. $ macth :
(시작-쿼리 시작 날짜; 종말-쿼리 종료 날짜)
dbobject match = (dbobject) json.parse ( "{$ match : { 'status': '1', 'time': {$ gte : '"+beginday+"', $ lte : '+endday+"'}} ");3. $ 그룹 :
(userID로 그룹화하고, 사용자 수를 세고, AMOUT 필드 값을 축적하며, AMOUT 필드의 최대 값을 취하십시오)
dbobject group = (dbobject) json.parse ( "{$ group : {_ id : '$ userId', count : {$ sum : 1}, Total : {$ sum : '$ move'}, maxSigle : {$ max : '$ max :'$ max : '$ max :'$ max : '$ max :'$ max : '$ max :'$ max : '$ max :'$ max : '$ max :'$ max : '$ max :'$ max : {$ max : '$ max : {$ max : {$ max :');조건이 접합 된 후 쿼리를 시작합니다.
목록 <dbobject> list = new ArrayList <dbobject> (); list.add (match); list.add (group); AggregationOutput output = mongotemplate.getCollection ( "테이블 이름"). Aggregate (list);
트래버스 결과에 대해 이야기 할 필요가 없습니다. 위의 내용은 자세히 설명되어 있습니다
두 번째 방법이 다른 방법보다 훨씬 간단합니까? 그러나 그것은 MongoDB 진술에 대한 친숙 함을 테스트합니다.
【펼친】
위의 방법이 확장됩니다
// 상태는 0 또는 1입니다. 11이 아닌 유형; time dbobject match = (dbobject) json.parse ( "{$ match : { 'status': {$ in : [ '0', '1']}, type : {$ ne : 11}, 'time': {$ gte : '+beginday+"', $ lte : '+endday+"'}}}}") 마지막으로 dbobject group = (dbobject) json.parse ( "{$ group : {_ _ id : '$ userId', count : {$ sum : 1}, 마지막 time : {$ max : '$ time'}}}"); // 이전 단계에서 계산 된 100 번 dbobject match = (dbobjject match) = (dbobjject =); 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}}"); dbobjject = (dbobjject = (dbobjject =)). json.parse ( "{$ sort : { 'count': -1}}"); // 목록 정렬 목록 <dbobject> list = new arraylist <dbobject> (); list.add (match); list.add (group); list.add (groupmatch); list.add (project); Aggregoutpute = MOMNCOTPORTE (MOMNGOT.GET name ") .aggregate (list); // 쿼리 결과3. Basicdbobject+스크립트 문
BasicdBobject groupIndex = new BasicdBobject (); BasicdBobject ConrestQuery = new BasicdBobject (); Construpery.put ( "userId", new BasicdBobject ( "$ in", userIds)); // userIds array basicdbobject = new Basicdbobject (new BasicdBobject (); initIndex.put ( "// 0);"// 0); 데이터베이스의 데이터를 나타냅니다 .prev는 쿼리 결과를 나타냅니다. Query result // prev.count 여기에 계산은 이전 단계 initIndex의 카운트입니다. initIndex의 카운트) string ret regen = "function (doc, prev) {if (doc.status == 0) {prev.count+= 1;}"; list <map <string, object >> basicdblist = (list <map <string, object >>) monmoTplate. getCollection ( "Collection"). Group (GroupIndex, DistrictQuery, InitIndex, Reduce, Null);마지막으로 목록을 통해 루핑하여 결과를 얻을 수 있습니다. [PS : 그룹 의이 집계 방법에 제한이 있습니다 .--> 20,000 개의 데이터를 초과하면 오류가 발생합니다.]
위의 내용은 일반 비즈니스 처리에서 MongoDB 집계 처리를 사용하는 것입니다. 더 나은 방법이나 개선이 필요한 것이 있으면 메시지를 남겨주세요 ~