0

MongoDB를 처음 사용했기 때문에 운이 없어도 특정 쿼리를 실행하는 데 어려움을 겪었습니다. 날짜 및 금액이있는 수백만 건의 문서가있는 컬렉션이 있습니다. 특정 기간 동안 집계를 가져 오려고합니다. 예를 들어, 내가 카운트를 얻으려면, 1/1/2015 - 15/1/2015 사이 샘플 수집 그룹은 개별 날짜 범위를 기반으로합니다.

1/2/2015 - 15/2/2015 사이의 기간에 대한 금액 합산 출력은 다음과 같이 될 것이다 1/1/2017 - 10/10/20171/2/2017 - 10/2/2017 사이의 날짜 범위에 대한

{ "_id" : "148404972864202083547392254", "account" : "3600", "amount" : 50, "date" : ISODate("2017-01-01T12:02:08.642Z")} 

{ "_id" : "148404972864202085437392254", "account" : "3600", "amount" : 50, "date" : ISODate("2017-01-03T12:02:08.642Z")} 

{ "_id" : "148404372864202083547392254", "account" : "3600", "amount" : 70, "date" : ISODate("2017-01-09T12:02:08.642Z")} 

{ "_id" : "148404972864202083547342254", "account" : "3600", "amount" : 150, "date" : ISODate("2017-01-22T12:02:08.642Z")} 

{ "_id" : "148404922864202083547392254", "account" : "3600", "amount" : 200, "date" : ISODate("2017-02-02T12:02:08.642Z")} 

{ "_id" : "148404972155502083547392254", "account" : "3600", "amount" : 30, "date" : ISODate("2017-02-7T12:02:08.642Z")} 

{ "_id" : "148404972864202122254732254", "account" : "3600", "amount" : 10, "date" : ISODate("2017-02-10T12:02:08.642Z")} 

입니다 :

  • 2017년 1월 1일 - 2017년 10월 1일 - 카운트 = 3, 금액 합계 : 170
  • 2017년 10월 2일 - 15/2/2017 - 개수 = 2, 총계 : 40

이렇게 다른 기간으로 작업 할 수 있습니까? 이 코드는 Java로 작성되었지만 mongo의 예제로 누군가 나를 도와 줄 수 있습니까?

답변

1

보다 세련된 해결책이 있어야합니다. 어쨌든 함수에 랩핑하고 날짜 관련 인수를 일반화 할 수 있습니다.

먼저 항목을 이동하는 범위를 결정할 때 동시에 투영해야합니다 (거대한 $switch 표현에 유의하십시오). 기본적으로 항목은 'null'범위로 이동합니다.

그런 다음 기준과 일치하지 않는 결과 (예 : range! = null)를 필터링합니다.

마지막 단계는 범위별로 항목을 그룹화하고 필요한 모든 계산을 수행하는 것입니다.

db.items.aggregate([ 
    { $project : { 
    amount : true, 
    account : true, 
    date : true, 
    range : { 
     $switch : { 
     branches : [ 
      { 
      case : { 
       $and : [ 
       { $gte : [ "$date", ISODate("2017-01-01T00:00:00.000Z") ] }, 
       { $lt : [ "$date", ISODate("2017-01-10T00:00:00.000Z") ] } 
       ] 
      }, 
      then : { $concat : [ 
       { $dateToString: { format: "%d/%m/%Y", date: ISODate("2017-01-01T00:00:00.000Z") } }, 
       { $literal : " - " }, 
       { $dateToString: { format: "%d/%m/%Y", date: ISODate("2017-01-10T00:00:00.000Z") } } 
      ] } 
      }, 
      { 
      case : { 
       $and : [ 
       { $gte : [ "$date", ISODate("2017-02-01T00:00:00.000Z") ] }, 
       { $lt : [ "$date", ISODate("2017-02-10T00:00:00.000Z") ] } 
       ] 
      }, 
      then : { $concat : [ 
       { $dateToString: { format: "%d/%m/%Y", date: ISODate("2017-02-01T00:00:00.000Z") } }, 
       { $literal : " - " }, 
       { $dateToString: { format: "%d/%m/%Y", date: ISODate("2017-02-10T00:00:00.000Z") } } 
      ] } 
      } 
     ], 
     default : null 
     } 
    } 
    } }, 
    { $match : { range : { $ne : null } } }, 
    { $group : { 
    _id : "$range", 
    count : { $sum : 1 }, 
    "amount summation" : { $sum : "$amount" } 
    } } 
]) 

은 데이터를 바탕으로 다음과 같은 결과 *를 줄 것이다 : 데이터가 다를 이유

난 당신이 귀하의 질문에 몇 가지 오타가 생각 *
{ "_id" : "01/02/2017 - 10/02/2017", "count" : 2, "amount summation" : 230 } 
{ "_id" : "01/01/2017 - 10/01/2017", "count" : 3, "amount summation" : 170 } 

, 그건.