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

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

감사!



답변

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 커넥터입니다.


답변

로부터 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") }})


답변

이 시도:

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


답변

나는 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()


답변

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

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

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


답변

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 ) }
    } )

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


답변

이건 내 문서 야

"_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

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