mongodb에서 ISODate를 사용한 날짜 쿼리가 작동하지 않는 것 같습니다.


189

MongoDB에서 작동하는 가장 기본적인 날짜 쿼리조차 얻을 수없는 것 같습니다. 다음과 같은 문서가 있습니다.

{
    "_id" : "foobar/201310",
    "ap" : "foobar",
    "dt" : ISODate("2013-10-01T00:00:00.000Z"),
    "tl" : 375439
}

그리고 다음과 같은 쿼리 :

{ 
    "dt" : { 
        "$gte" : { 
            "$date" : "2013-10-01T00:00:00.000Z"
        }
    }
}

실행 결과0입니다 .

db.mycollection.find({
  "dt" : { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z"}}
})

왜 이것이 작동하지 않는지 아십니까?

참고 로이 쿼리는 Spring의 MongoTemplate에 의해 생성 되므로 궁극적으로 MongoDB로 전송되는 쿼리를 직접 제어 할 수 없습니다.

(추신)

> db.version()
2.4.7

감사!

답변:


312

MongoDB Extended JSON$date 의 일부 이지만 이것이 기본값으로 얻는 것입니다. 실제로 쿼리의 일부로 사용할 수 있다고 생각하지 않습니다.mongoexport

$date아래와 같이 정확한 검색을 시도하면 :

db.foo.find({dt: {"$date": "2012-01-01T15:00:00.000Z"}})

오류가 발생합니다.

error: { "$err" : "invalid operator: $date", "code" : 10068 }

이 시도:

db.mycollection.find({
    "dt" : {"$gte": new Date("2013-10-01T00:00:00.000Z")}
})

또는 ( @ user3805045의 의견 다음 ) :

db.mycollection.find({
    "dt" : {"$gte": ISODate("2013-10-01T00:00:00.000Z")}
})

ISODate시간없이 날짜를 비교해야 할 수도 있습니다 ( @MattMolnar로 표시 ).

mongo Shell의 데이터 유형에 따르면 둘 다 동일해야합니다.

mongo 쉘은 날짜를 문자열 또는 Date 객체로 반환하는 다양한 방법을 제공합니다.

  • 현재 날짜를 문자열로 반환하는 Date () 메서드
  • ISODate () 래퍼를 사용하여 Date 객체를 반환하는 new Date () 생성자
  • ISODate () 래퍼를 사용하여 Date 객체를 반환하는 ISODate () 생성자

사용 ISODate 하면 여전히 Date 객체가 반환되어야합니다 .

{"$date": "ISO-8601 string"}엄격한 JSON 표현이 필요할 때 사용할 수 있습니다. 한 가지 가능한 예는 Hadoop 커넥터입니다.


3
네. QuerySpring 에서 객체 를 인쇄 할 때 반환되는 것에 의해 버림받은 것 같습니다 . 직렬화 된 형식의 쿼리는 몽고 쉘에 복사 / 붙여 넣기 만 할 수있는 유효한 쿼리 일 필요는 없습니다. 범인은 여기에 있습니다 : grepcode.com/file/repo1.maven.org/maven2/org.mongodb/…
Jason Polites

2
시간이없는 부분 날짜를 비교할 때에서로 전환 new Date('2016-03-09')해야했습니다 ISODate('2016-03-09'). 전자는 과거 $gte쿼리 에서 날짜를 반환 합니다.
Matt Molnar

@MattMolnar 주목하고 답변을 속성으로 업데이트했습니다. 감사.
zero323

92

로부터 MongoDB의 요리 책 페이지 댓글 :

"dt" : 
{
    "$gte" : ISODate("2014-07-02T00:00:00Z"), 
    "$lt" : ISODate("2014-07-03T00:00:00Z") 
}

이것은 나를 위해 일했습니다. 전체 컨텍스트에서 다음 명령은 dt날짜 필드에 2013-10-01 (YYYY-MM-DD) Zulu 날짜가있는 모든 레코드를 가져옵니다 .

db.mycollection.find({ "dt" : { "$gte" : ISODate("2013-10-01T00:00:00Z"), "$lt" : ISODate("2013-10-02T00:00:00Z") }})

1
"ISODate undefined"오류가 발생했습니다. 이 문제를 해결할 수 없었습니다.
Batuhan Akkaya 19

@BatuhanAkkaya pymongo가 포함 된 Python의 경우와 datetime.datetime같습니다 ISODate.
jtbr

12

이 시도:

{ "dt" : { "$gte" : ISODate("2013-10-01") } }

5

나는 mongodb 클라이언트 GUI로 robomongo를 사용하고 있으며 아래는 나를 위해 일했습니다.

db.collectionName.find({"columnWithDateTime" : {
$lt:new ISODate("2016-02-28T00:00:00.000Z")}})

응용 프로그램 측에서 nodejs 기반 드라이버 mongodb (v1.4.3)를 사용하고 있습니다. 응용 프로그램은 YYYY-mm-dd와 같은 날짜를 제공하는 UI의 datepicker를 사용합니다. 이것은 00:00:00과 같은 기본 시간이 추가 된 다음 제공됩니다 받는 new Date()생성자 다음 기준이 오브젝트 MongoDB를 공급, 내가 드라이버 변환 ISO 날짜에 날짜와 다음 작동하고 원하는 출력을 제공하는 쿼리를 생각하지만 같은 new Date()생성자는하지 작업을 수행하거나 동일한을 위해, 로보 몽고에 동일한 출력을 보여줍니다 robomongo를 사용하여 기준 객체를 교차 확인했기 때문에 기준이 이상합니다.

기본 CLI의 mongoshell은 모두 잘 작동 반면 ISODatenew Date()


1
팁 주셔서 감사합니다, Robomongo는 Mongo Compass보다 훨씬 좋습니다
Alex

5

JSON 엄격 모드에서는 순서를 유지해야합니다.

{
    "dt": {
        "$gte": {
            "$date": "2013-10-01T00:00:00.000Z"
        }
    }
}

mlab.com에서 내 검색어를 정의하는 데만 도움이되었습니다.


쿼리 실행 중 오류가 발생했습니다. 이유 : (invalid_operator) 유효하지 않은 연산자 : $ date
saber tabatabaee yazdi

2

MongoDB 쉘에서 :

db.getCollection('sensorevents').find({from:{$gt: new ISODate('2015-08-30 16:50:24.481Z')}})

내 nodeJS 코드에서 (Mongoose 사용)

    SensorEvent.Model.find( {
        from: { $gt: new Date( SensorEventListener.lastSeenSensorFrom ) }
    } )

'시작'필드가 지정된 날짜보다 큰 값을 반환하기 위해 센서 이벤트 콜렉션을 조회하고 있습니다.


4
스택 오버플로에 오신 것을 환영합니다! 질문에 대한 답변을 게시하고 "This is my first post"와 같은 추가 내용을 게시하지 마십시오. 스택 오버플로는 게시판이 아니라 위키 백과로 생각하십시오.
durron597

1

이건 내 문서 야

"_id" : ObjectId("590173023c488e9a48e903d6"),
    "updatedAt" : ISODate("2017-04-27T04:26:42.709Z"),
    "createdAt" : ISODate("2017-04-27T04:26:42.709Z"),
    "flightId" : "590170f97cb84116075e2680",

 "_id" : ObjectId("590173023c488e9a48e903d6"),
        "updatedAt" : ISODate("2017-04-28T03:26:42.609Z"),
        "createdAt" : ISODate("2017-04-28T03:26:42.609Z"),
        "flightId" : "590170f97cb84116075e2680",

이제 27 번째 날짜마다 문서를 찾고 싶습니다. 그래서 이것을 사용했습니다 ....

 > db.users.find({createdAt:{"$gte":ISODate("2017-04-27T00:00:00Z"),"$lt":ISODate("2017-04-28T00:00:00Z") }}).count()

result:1

이것은 나를 위해 일했습니다.


0

이것은 현재보다 작거나 같은 값을 검색하는 동안 저에게 효과적이었습니다.

db.collectionName.find({ "dt": { "$lte" : new Date() + "" } });

0

그것을 감싸십시오 new Date():

{ "dt" : { "$lt" : new Date("2012-01-01T15:00:00.000Z") } }

0

오래된 질문이지만 여전히 첫 번째 Google 조회수이므로 여기에 게시하여 더 쉽게 찾을 수 있습니다.

Mongo 4.2 및 집계 () 사용 :

db.collection.aggregate(
    [
     { $match: { "end_time": { "$gt": ISODate("2020-01-01T00:00:00.000Z")  } } },
     { $project: {
          "end_day": { $dateFromParts: { 'year' : {$year:"$end_time"}, 'month' : {$month:"$end_time"}, 'day': {$dayOfMonth:"$end_time"}, 'hour' : 0  } }
     }}, 
     {$group:{
        _id:   "$end_day",
        "count":{$sum:1},
    }}
   ]
)

이것은 groupby 변수를 날짜로 제공하며 때로는 구성 요소 자체로 다루는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.