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분 간격으로 그룹화된 결과를 얻어야 합니다.
이를 위한 몇 가지 방법이 있습니다.
첫 번째는 문서의 "날짜" 값을 해부할 수 있는 날짜 집계 연산자입니다.특히 "그룹화"를 주요 목적으로 합니다.
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
저는 여러분이 정말로 하고 싶은 것에 대한 여러분 자신의 실제 진술 대신에 기본적인 "카운트" 예를 사용하고 있습니다.
MongoDB 4.x 이상
원래 작성 이후로 날짜 집계 연산자에 몇 가지 추가되었지만 MongoDB 4.0부터는 BSON 날짜 변환으로 수행되는 기본 수학 트릭과 반대로 실제 "유형의 실제 주조"가 있을 것입니다.
예를 들어 및 를 새 도우미로 사용할 수 있습니다.
db.collection.aggregate([
{ "$group": {
"_id": {
"$toDate": {
"$subtract": [
{ "$toLong": "$created_at" },
{ "$mod": [ { "$toLong": "$created_at" }, 1000 * 60 * 15 ] }
]
}
},
"count": { "$sum": 1 }
}}
])
이는 조금 더 짧으며 "epoch" 값에 대한 외부 BSON 날짜를 파이프라인을 정의할 때 상수로 정의할 필요가 없으므로 모든 언어 구현에 대해 상당히 일관됩니다.
이들은 형식 변환을 위한 "도우미" 방법 중 두 가지에 불과하며, 모두 이 방법과 관련이 있습니다. 이는 사용자 정의 처리를 허용하는 구현의 "더 긴" 형태입니다.null
또는 변환 오류입니다.
심지어 그러한 캐스팅으로 그것을 얻는 것은 가능합니다.Date
로부터의 정보ObjectId
이것이 "생성" 날짜의 신뢰할 수 있는 소스가 될 수 있으므로 기본 키:
db.collection.aggregate([
{ "$group": {
"_id": {
"$toDate": {
"$subtract": [
{ "$toLong": { "$toDate": "$_id" } },
{ "$mod": [ { "$toLong": { "$toDate": "$_id" } }, 1000 * 60 * 15 ] }
]
}
},
"count": { "$sum": 1 }
}}
])
따라서 이러한 종류의 변환을 사용하는 "캐스팅 유형"은 매우 강력한 도구가 될 수 있습니다.
경고 -
ObjectId
값은 변환을 허용하는 데이터의 일부를 구성하는 내부 시간 값에 대해서만 초 단위로 정밀도로 제한됩니다.실제 삽입된 "시간"은 대부분 사용 중인 드라이버에 따라 다릅니다.정밀도가 필요한 경우에는 다음과 같은 조건에 의존하는 대신 개별 BSON 날짜 필드를 사용하는 것이 좋습니다.ObjectId
가치.
저는 여기에 있는 다른 답을 좋아합니다. 대부분은 통합 날짜 연산자 대신 날짜 수학을 사용하기 위한 것입니다. 이 연산자는 도움이 되지만 약간 모호할 수도 있습니다.
여기서 추가하고 싶은 것은 당신이 또한 반품할 수 있다는 것입니다.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 }
}}
])
그Date(0)
여기서 JavaScript의 구성은 epoch에서 0밀리초가 epoch이기 때문에 동일한 "epoch" 날짜를 더 짧은 형식으로 나타냅니다.에 "식별자로 때, 결과는 는 "BSON"과 " 날짜 객체에 대한 "추가"입니다.Date
.
모든 드라이버가 기본값을 반환합니다.Date
이 접근법으로 그들의 언어를 입력합니다.
다른 유용한 방법:
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" } },
}},
])
mongod db.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}}
])
MongoDB 5.x 이상
이제 Aggregation 파이프라인에서 날짜 잘라내기가 지원됩니다. 예:
{
$group: {
"_id": { "$dateTrunc": { date: "$created_at", unit: "minute", binSize: 15 } },
"count" : { $sum: 1 }
}
},
창 기능 및 dateTrunch에 대한 유용한 정보도 여기에서 찾을 수 있습니다.
@MongoDb 4.x 이상에 대한 Neil Lunn의 https://stackoverflow.com/a/26814496/8474325 답변은 환상적입니다.그러나 그가 집계에 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 }
}}
])
MongoDB v5.0+를 사용하면 를 사용하여 근처의 문서(즉, 15분 간격 내의 문서)에 대한 계산을 수행할 수 있습니다.다음 예제에서는 현재 문서 전후 15분인 모든 문서를 계산합니다.다음을 변경하여 조정할 수 있습니다.window
PARAM.
db.collection.aggregate([
{
$setWindowFields: {
partitionBy: null,
sortBy: {
created_at: 1
},
output: {
count: {
$count: {},
window: {
range: [
-15,
15
],
unit: "minute"
}
}
}
}
}
])
여기는 참고로 몽고 놀이터입니다.
언급URL : https://stackoverflow.com/questions/26814427/group-result-by-15-minutes-time-interval-in-mongodb
'programing' 카테고리의 다른 글
git 삭제 후 커밋이 수행되지 않은 삭제된 파일 복구 (0) | 2023.05.22 |
---|---|
첫 번째 줄로만 git log를 출력하는 방법은 무엇입니까? (0) | 2023.05.22 |
.net 콘솔 응용 프로그램에 메시지 상자 표시 (0) | 2023.05.22 |
IIS7 배포 - '시스템'을 복제합니다.web.extensions/scriptResourceHandler' 섹션 (0) | 2023.05.22 |
C# LINQ.DocumentDb CreateDocument에서 작업하지 않는 모든 항목쿼리 (0) | 2023.05.17 |