[MONGODB] MongoDB의 15 분의 시간 간격에 의한 그룹 결과
MONGODBMongoDB의 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.이 작업을 수행하는 방법이 몇 가지 있습니다.
이 작업을 수행하는 방법이 몇 가지 있습니다.
먼저 문서에서 "날짜"값을 해부 할 수 있도록 날짜 집계 연산자로입니다. 특히 기본 의도로 "그룹화"에 대한 :
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.나는 여기에 다른 대답처럼, 주로 도움이 수 있지만 또한 약간 모호한 수 날짜 수학 대신 집계 날짜 연산자를 사용합니다.
나는 여기에 다른 대답처럼, 주로 도움이 수 있지만 또한 약간 모호한 수 날짜 수학 대신 집계 날짜 연산자를 사용합니다.
내가 여기에 추가 할 수있는 유일한 방법은 결과로 "숫자"타임 스탬프에 반대하기이 방법에 의해 집계 프레임 워크에서 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.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.또 다른 유용한 방법 :
또 다른 유용한 방법 :
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.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 } }} ])
from https://stackoverflow.com/questions/26814427/group-result-by-15-minutes-time-interval-in-mongodb by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 절 보증 순서에서와 MongoDB를의 $ (0) | 2019.11.29 |
---|---|
[MONGODB] 두 번 중첩 된 배열에서 찾기 MongoDB를 (0) | 2019.11.29 |
[MONGODB] 몽구스의 채우기 후 쿼리 (0) | 2019.11.29 |
[MONGODB] 방법 "과 같은"로 MongoDB의 쿼리를 하는가? (0) | 2019.11.29 |
[MONGODB] 두 날짜 사이의 객체를 찾기 MongoDB를 (0) | 2019.11.29 |