날짜를 기준으로 쿼리를 반환


209

mongodb에 이와 같은 데이터가 있습니다.

{ 
    "latitude" : "", 
    "longitude" : "", 
    "course" : "", 
    "battery" : "0", 
    "imei" : "0", 
    "altitude" : "F:3.82V", 
    "mcc" : "07", 
    "mnc" : "007B", 
    "lac" : "2A83", 
    "_id" : ObjectId("4f0eb2c406ab6a9d4d000003"), 
    "createdAt" : ISODate("2012-01-12T20:15:31Z") 
}

db.gpsdatas.find({'createdAt': ??what here??})위의 데이터 결과를 db에서 나에게 반환하도록 어떻게 쿼리 합니까?


어떤 nodejs 라이브러리를 사용하고 있는지 언급하는 것이 효과적 이었으나 예제를 바탕으로 mongoosejs처럼 보입니다.
Grimnoff

답변:


421

주어진 날짜 이후에 만들어진 모든 항목과 같이 범위 쿼리를 원할 수 있습니다.

db.gpsdatas.find({"createdAt" : { $gte : new ISODate("2012-01-12T20:15:31Z") }});

내가 사용하고 $gte이 종종 시간 구성 요소 00:00:00 날짜 만 쿼리에 사용되기 때문에, (보다 크거나 같음).

다른 날짜와 동일한 날짜를 찾으려면 구문은 다음과 같습니다.

db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") });

14
Ahh :) 나는 당신이 Mongo 콘솔을 사용하고 있다고 생각했다. ISODatejs Date 객체의 래퍼가 있습니다 . 같은 것을 시도하십시오 "createdAt" : new Date("2010-01-01"). 그러나 어떤 이유로 Mongo 콘솔에서 해당 코드가 작동 하지 않습니다 (2.0.2 버전).
mnemosyn 2012 년

날짜 초기화에 대시 대신 슬래시를 사용합니까? 같은 :new Date("2010/01/01");
빅터 S

16

해당 날짜의 모든 항목을 가져 오려면 두 날짜를 비교해야합니다.

하루의 시작과 끝을 얻기 위해 이와 같이 첫 번째 날짜로부터 두 개의 날짜를 만들 수 있습니다.

var startDate = new Date(); // this is the starting date that looks like ISODate("2014-10-03T04:00:00.188Z")

startDate.setSeconds(0);
startDate.setHours(0);
startDate.setMinutes(0);

var dateMidnight = new Date(startDate);
dateMidnight.setHours(23);
dateMidnight.setMinutes(59);
dateMidnight.setSeconds(59);

### MONGO QUERY

var query = {
        inserted_at: {
                    $gt:morning,
                    $lt:dateScrapedMidnight
        }
};

//MORNING: Sun Oct 12 2014 00:00:00 GMT-0400 (EDT)
//MIDNIGHT: Sun Oct 12 2014 23:59:59 GMT-0400 (EDT)

16

Node v0.12.7 및 v4.4.4를 사용하여 Mongo v3.2.3에서 비슷한 것을 구현하고 다음을 사용했습니다.

{ $gte: new Date(dateVar).toISOString() }

ISODate (예 : 2016-04-22T00 : 00 : 00Z)를 전달하고 있으며 toISOString 함수가 있거나없는 .find () 쿼리에서 작동합니다. 그러나 .aggregate () $ match 쿼리에서 사용할 때는 toISOString 함수가 마음에 들지 않습니다!


12

지난 5 분 동안 모든 새로운 것을 얻으려면 계산을해야하지만 어렵지는 않습니다 ...

먼저 일치시킬 속성에 대한 인덱스를 만듭니다 (내림차순으로 정렬 방향 -1, 오름차순으로 1 포함)

db.things.createIndex({ createdAt: -1 }) // descending order on .createdAt

그런 다음 마지막 5 분 (60 초 * 5 분) 동안 생성 된 문서를 쿼리하십시오 .getTime().javascript의 new Date()생성자 는 생성자 에 대한 입력으로 사용하기 전에 1000 단위로 밀리 초를 반환해야하기 때문 입니다.

db.things.find({
        createdAt: {
            $gte: new Date(new Date().getTime()-60*5*1000).toISOString()
         }
     })
     .count()

설명 new Date(new Date().getTime()-60*5*1000).toISOString()은 다음과 같습니다.

먼저 "5 분 전"을 계산합니다.

  1. new Date().getTime() 현재 시간을 밀리 초 단위로 제공
  2. 우리는 5 분 (ms 단위)을 빼고 싶습니다 5*60*1000.-- 60몇 초 만 곱하면 변경하기 쉽습니다. 난 그냥 변경할 수 있습니다 5120나는 2 시간 (120 분이)합니다.
  3. new Date().getTime()-60*5*1000우리에게 1484383878676(5 분 전 ms)

이제 new Date()MongoDB 타임 스탬프에 필요한 ISO 문자열 형식을 얻기 위해 생성자 에 공급해야합니다 .

  1. { $gte: new Date(resultFromAbove).toISOString() } (mongodb .find () 쿼리)
  2. 변수를 가질 수 없으므로 한 번에 모든 작업을 수행 할 수 있습니다. new Date(new Date().getTime()-60*5*1000)
  3. ... 그런 다음 ISO 문자열로 변환하십시오. .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() 우리에게 주어지다 2017-01-14T08:53:17.586Z

물론 node-mongodb-native 드라이버를 사용하는 경우 변수를 사용하면 조금 더 쉽습니다.하지만 이것은 일반적으로 물건을 확인하는 데 사용되는 mongo 셸에서 작동합니다.


1
나는 당신이 Date.now()대신 사용할 수 있다고 생각합니다new Date().getTime()
Béranger

4

시도해 볼 수도 있습니다 :

{
    "dateProp": { $gt: new Date('06/15/2016').getTime() }
}

2

몽구스를 사용하는 경우

try {
  const data = await GPSDatas.aggregate([
    {
      $match: { createdAt : { $gt: new Date() }
    },
    {
      $sort: { createdAt: 1 }
    }
  ])
  console.log(data)

} catch(error) {
    console.log(error)
}

1

특정 날짜로 찾기 :

db.getCollection('CollectionName').find({"DepartureDate" : new ISODate("2019-06-21T00:00:00.000Z")})

gte거나 작은 찾기 lt:

db.getCollection('CollectionName').find({"DepartureDate" : { $gte : new ISODate("2019-06-11T00:00:00.000Z") }})

범위로 찾기 :

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.