source

Mongodb를 사용하여 최근 X분 데이터를 가져오는 쿼리

ittop 2023. 7. 6. 22:36
반응형

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

반응형