Mongodb를 사용하여 최근 X분 데이터를 가져오는 쿼리
다음 문서 형식을 가진 내 DB를 쿼리하려고 합니다.
{
"_id" : ObjectId("520b8b3f8bd94741bf006033"),
"value" : 0.664,
"timestamp" : ISODate("2013-08-14T13:48:35Z"),
"cr" : ISODate("2013-08-14T13:50:55.834Z")
}
다음 쿼리를 사용하여 날짜/시간에서 마지막 레코드를 가져올 수 있습니다.
db.mycol.find({timestamp:{$gt: ISODate("2013-08-14T13:48:00Z")}}).sort({x:1});
하지만 저는 18분 전의 값 필드와 타임스탬프가 있는 세트를 얻으려고 합니다.
18분 동안의 부분은 MongoDB에 관한 것이 아니라 JavaScript와 Mongo 셸에서 사용할 수 있는 것에 관한 것입니다.
query = {
timestamp: { // 18 minutes ago (from now)
$gt: new Date(ISODate().getTime() - 1000 * 60 * 18)
}
}
mongo 쉘에서 작동하지만, 다른 언어에 Mongo 드라이버를 사용하는 것은 정말 다를 것입니다.
값과 타임스탬프를 모두 사용하여 더 작은 스키마 위에 "프로젝션"하려면:
projection = {
_id: 0,
value: 1,
timestamp: 1,
}
두 가지 모두 적용:
db.mycol.find(query, projection).sort({timestamp: 1});
중복이 있을 수 있기 때문에 아직 "집합"이 아닙니다.제거하려면 다음을 사용할 수 있습니다.$group
통합 프레임워크에서:
db.mycol.aggregate([
{$match: query},
{$group: {
_id: {
value: "$value",
timestamp: "$timestamp",
}
}},
{$project: {
value: "$_id.value",
timestamp: "$_id.timestamp",
}},
{$sort: {timestamp: 1}},
])
아래와 같은 작업도 수행할 수 있습니다.
db.getCollection('collectionName').find({timestamp : {$gte: new Date().getTime()-(60*60*1000) } } )
위의 쿼리는 타임스탬프 b/w 기록과 60분을 제공합니다.60분 이상(예: 2시간)을 원한다면 30분 동안(30*60*1000) 식을 (2*60*60*1000)으로 변경할 수 있습니다.
시작 위치Mongo 5
사용할 수 있습니다.
// { date: ISODate("2021-12-05T20:32:56Z") } <= 5 minutes ago
// { date: ISODate("2021-12-05T20:07:56Z") } <= 25 minutes ago (older than 18 minutes)
db.collection.aggregate([
{ $match: {
$expr: {
$gt: [
"$date",
{ $dateSubtract: { startDate: "$$NOW", unit: "minute", amount: 18 } }
]
}
}}
])
// { date: ISODate("2021-12-05T20:32:56Z") } <= 5 minutes ago
와 함께$dateSubtract
문서를 보관하는 가장 오래된 날짜/시간을 감산하여 만듭니다.18
(amount
)"minute"
(unit
) 현재 날짜를 벗어남(startDate
).
nodejs를 사용하여 mongodb에서 현재 타임스탬프의 데이터에 액세스할 수 있습니다.
const collection1 = dbo.collection('customers');
var dateq = new Date();
collection1.find({ "Timestamp" : { $gt: new Date(dateq.getTime() - 6000)}
}).toArray(function(err , docs){
console.log(docs);
}
코드 끝
와우, @Alistair_Nelson 덕분에 n분 전의 데이터를 얻을 수 있었습니다. 예를 들어 ISO Date의 마지막 18분("2013-08-14T14:00:00Z"):
db.mycol.find({timestamp:{$gt: new Date(ISODate("2013-08-14T14:00:00Z")-18*60000)}})
필요한 필드만 가져오려면:
db.mycol.find({timestamp:{$gt: new Date(ISODate("2013-08-14T14:00:00Z")-18*60000)}},{value:1,timestamp:1, _id:0})
const xMins = 10;
db.mycol.find({ timestamp: { $gt: new Date(Date.now() - 1000 * 60 * xMins) } }).sort({ x: 1 });
언급URL : https://stackoverflow.com/questions/18233945/query-to-get-last-x-minutes-data-with-mongodb
'source' 카테고리의 다른 글
루비에 있는 각각의 자동 카운터? (0) | 2023.07.06 |
---|---|
백분위수_백분위수 대 백분위수_계속 (0) | 2023.07.06 |
pip: _internal이라는 이름의 모듈이 없습니다. (0) | 2023.07.06 |
리눅스에서 C 또는 C++의 프로세스에 대한 CPU 선호도를 설정하는 방법은 무엇입니까? (0) | 2023.07.06 |
CUBE와 ROLLUP의 차이점 이해 (0) | 2023.07.06 |