복붙노트

[MONGODB] MongoDB의 15 분의 시간 간격에 의한 그룹 결과

MONGODB

MongoDB의 15 분의 시간 간격에 의한 그룹 결과

나는이 구조와 같은 "상태"컬렉션이 -

{
    _id: ObjectId("545a0b63b03dbcd1238b4567"),
    status: 1004,
    comment: "Rem dolor ipsam placeat omnis non. Aspernatur nobis qui nisi similique.",
    created_at: ISODate("2014-11-05T11:34:59.804Z")
},
{
    _id: ObjectId("545a0b66b03dbcd1238b4568"),
    status: 1001,
    comment: "Sint et eos vero ipsa voluptatem harum. Hic unde voluptatibus et blanditiis quod modi.",
    created_at: ISODate("2014-11-05T11:35:02.814Z")
}
....
....

그 컬렉션의 간격 15분별로 그룹화 결과를 얻을 필요가있다.

해결법

  1. ==============================

    1.이 작업을 수행하는 방법이 몇 가지 있습니다.

    이 작업을 수행하는 방법이 몇 가지 있습니다.

    먼저 문서에서 "날짜"값을 해부 할 수 있도록 날짜 집계 연산자로입니다. 특히 기본 의도로 "그룹화"에 대한 :

    db.collection.aggregate([
      { "$group": {
        "_id": {
          "year": { "$year": "$created_at" },
          "dayOfYear": { "$dayOfYear": "$created_at" },
          "hour": { "$hour": "$created_at" },
          "interval": {
            "$subtract": [ 
              { "$minute": "$created_at" },
              { "$mod": [{ "$minute": "$created_at"}, 15] }
            ]
          }
        }},
        "count": { "$sum": 1 }
      }}
    ])
    

    두 번째 방법은 날짜 오브젝트가 다른 날짜 오브젝트로부터 감산 (또는 다른 직접 수학 연산)하면, 그 결과는 두 개의 오브젝트 간의 에포크 소인 밀리 초를 나타내는 숫자 값을 조금 트릭을 사용하는 것이다. 그래서 당신은 시대의 밀리 세컨드 표현을 얻을 시대의 날짜를 사용. 그런 다음 간격 날짜 수학을 사용합니다 :

    db.collection.aggregate([
        { "$group": {
            "_id": {
                "$subtract": [
                    { "$subtract": [ "$created_at", new Date("1970-01-01") ] },
                    { "$mod": [ 
                        { "$subtract": [ "$created_at", new Date("1970-01-01") ] },
                        1000 * 60 * 15
                    ]}
                ]
            },
            "count": { "$sum": 1 }
        }}
    ])
    

    그것은 종류의 출력 형식의이 그룹화 간격하려는 작업에 따라 달라집니다 그래서. 모두 기본적으로 같은 일을 대표하고 코드에서 "날짜"개체로 재 구조에 대한 충분한 데이터를 가지고있다.

    당신은 그룹화 _id 후 "그룹화 연산자"부분에 당신이 원하는 무엇을 넣을 수 있습니다. 난 그냥 당신이 정말로 원하는 것에로서 자신의 실제 문 대신에 기본 "계산"예를 사용하고 있습니다.

    날짜 집계 연산자에 대한 몇 가지 추가 원래 쓰기 때문에이 있었지만, BSON 날짜 변환 여기 수행 기본적인 수학 트릭에 반대 MongoDB를 4.0에서 실제 "유형의 실제 캐스팅"가있을 것입니다.

    예를 들어 우리는 $ toLong 및 $ TODATE 여기에 새 도우미로 사용할 수 있습니다 :

    db.collection.aggregate([
      { "$group": {
        "_id": {
          "$toDate": {
            "$subtract": [
              { "$toLong": "$created_at" },
              { "$mod": [ { "$toLong": "$created_at" }, 1000 * 60 * 15 ] }
            ]
          }
        },
        "count": { "$sum": 1 }
      }}
    ])
    

    즉 조금 짧은 그리고 그것은 모든 언어 구현을 위해 매우 일관된 그래서 파이프 라인을 정의하는 상수로서 "시대"값을 외부 BSON 날짜를 정의 할 필요가 없습니다.

    이러한 형식 변환을위한 "도우미"방법의 두되는 변환에 널 (null) 또는 오류에 처리 사용자 정의를 허용 구현의 "이상"형태 인 $ 변환 방법, 모든 넥타이 다시.

    이 "창조"최신의 신뢰할 수있는 소스가 될 것처럼 그것은, 기본 키의 ObjectId가에서 날짜 정보를 얻을 수 등의 캐스팅으로도 가능합니다 :

    db.collection.aggregate([
      { "$group": {
        "_id": {
          "$toDate": {
            "$subtract": [
              { "$toLong": { "$toDate": "$_id" }  },
              { "$mod": [ { "$toLong": { "$toDate": "$_id" } }, 1000 * 60 * 15 ] }
            ]
          }
        },
        "count": { "$sum": 1 }
      }}
    ])
    

    그래서 변환 이런 종류의와 함께 "유형을 주조하는 것은"매우 강력한 도구가 될 수 있습니다.

  2. ==============================

    2.나는 여기에 다른 대답처럼, 주로 도움이 수 있지만 또한 약간 모호한 수 날짜 수학 대신 집계 날짜 연산자를 사용합니다.

    나는 여기에 다른 대답처럼, 주로 도움이 수 있지만 또한 약간 모호한 수 날짜 수학 대신 집계 날짜 연산자를 사용합니다.

    내가 여기에 추가 할 수있는 유일한 방법은 결과로 "숫자"타임 스탬프에 반대하기이 방법에 의해 집계 프레임 워크에서 Date 객체를 반환 할 수 있다는 것입니다. 그것은 $ 추가를 사용하여 동일한 원칙에 조금 추가 수학입니다 :

    db.collection.aggregate([
        { "$group": {
            "_id": {
                "$add": [
                    { "$subtract": [
                        { "$subtract": [ "$current_date", new Date(0) ] },
                        { "$mod": [ 
                            { "$subtract": [ "$current_date", new Date(0) ] },
                            1000 * 60 * 15
                        ]}
                    ] },
                    new Date(0)
                ]
            },
            "count": { "$sum": 1 }
        }}
    ])
    

    시대에서 0 밀리 초는 시대이기 때문에 날짜 자바 스크립트 (0) contructs 여기에, 짧은 형태로 같은 "시대"날짜를 나타냅니다. 그러나 중요한 점은 또 다른 BSON 날짜 개체에 "또한"이 숫자 식별자가 완료되면, 다음의 조건의 반대가 사실이고 최종 결과가 지금 사실 일 것입니다.

    모든 드라이버는이 방법에 의해 그들의 언어에 대한 기본 날짜 형식을 반환합니다.

  3. ==============================

    3.mongodb.version () <3.0 더 아름다운 약간

    mongodb.version () <3.0 더 아름다운 약간

    db.collection.aggregate([
        {$match: {created_at:{$exists:1}}},
        {$group: {
            _id: {$add:[
                {$dayOfYear: "$created_at" },
                {$multiply: [{$year: "$created_at"}, 1000]}
            ]},
            count: {$sum: 1 }
        }},
        {$sort:{_id:-1}}
    ])
    
  4. ==============================

    4.또 다른 유용한 방법 :

    또 다른 유용한 방법 :

    db.collection.aggregate([
      {$group: {
        _id: { 
          overallTime: { 
            $dateToString: { format: "%Y-%m-%dT%H", date: "$created_at" } 
          },
          interval: { $trunc: { $divide: [{ $minute: "$created_at" }, 15 ]}}
        },
      }},
    ])
    

    그리고, 분,시, 일 간격으로 더 쉽게 :

    var format = "%Y-%m-%dT%H:%M"; // 1 min
    var format = "%Y-%m-%dT%H"; // 1 hour
    var format = "%Y-%m-%d"; // 1 day
    
    db.collection.aggregate([
      {$group: {
        _id: { $dateToString: { format: format, date: "$created_at" } },
      }},
    ])
    
  5. ==============================

    5.https://stackoverflow.com/a/26814496/8474325 MongoDB를위한에서 @Neil 룬의 대답은 위쪽으로 환상적이다 4.x의. 그러나 그는이 집계 ObjectId가를 사용하는 코드의 작은 실수가있다. 라인 { "$ TODATE": "_id는"}로 변경되어야한다 { "$ TODATE": "$ _id"} 작업에 코드.

    https://stackoverflow.com/a/26814496/8474325 MongoDB를위한에서 @Neil 룬의 대답은 위쪽으로 환상적이다 4.x의. 그러나 그는이 집계 ObjectId가를 사용하는 코드의 작은 실수가있다. 라인 { "$ TODATE": "_id는"}로 변경되어야한다 { "$ TODATE": "$ _id"} 작업에 코드.

    다음은 수정 된 코드입니다.

    db.collection.aggregate([
        { "$group": {
          "_id": {
              "$toDate": {
                  "$subtract": [
                      { "$toLong": { "$toDate": "$_id" }  },
                      { "$mod": [ { "$toLong": { "$toDate": "$_id" } }, 1000 * 60 * 15 ] }
                  ]
              }
          },
          "count": { "$sum": 1 }
       }}
    ])
    
  6. from https://stackoverflow.com/questions/26814427/group-result-by-15-minutes-time-interval-in-mongodb by cc-by-sa and MIT license