mongodb에 날짜 / 시간을 저장하는 가장 좋은 방법


177

문자열, 정수 타임 스탬프 및 몽고 날짜 시간 객체를 사용하는 것을 보았습니다.

답변:


200

가장 좋은 방법은 BSON 기본 Date 객체에 매핑되는 기본 JavaScript Date 객체 를 저장 하는 것 입니다.

> db.test.insert({date: ISODate()})
> db.test.insert({date: new Date()})
> db.test.find()
{ "_id" : ObjectId("..."), "date" : ISODate("2014-02-10T10:50:42.389Z") }
{ "_id" : ObjectId("..."), "date" : ISODate("2014-02-10T10:50:57.240Z") }

기본 유형은 예를 들어 맵 축소 작업에 사용할 수있는 다양한 유용한 방법을 기본적으로 지원합니다 .

필요한 경우 메소드와 생성자를 사용하여 Date오브젝트를 Unix 타임 스탬프 1) 에서 쉽게 변환 할 수 있습니다 .getTime()Date(milliseconds)

1) 엄밀히 말하면, 유닉스 타임 스탬프는 초 단위 로 측정됩니다 . JavaScript Date 객체 는 Unix 시대 이후 밀리 초 단위로 측정됩니다 .


9
이것이 DB에 어떻게 저장됩니까? 몽고 날짜 시간 객체로?
Thilo

2
@ Thilo : MongoDB에는 내가 아는 한 특별한 'datetime'객체가 없습니다. BSON 형식으로 저장된 JavaScript 날짜 유형을 사용합니다.
Niels van der Rest

1
@Thilo : 맞습니다. 기본적으로 JavaScript Date 객체의 BSON 표현입니다. 유닉스 시대부터 밀리 초를 저장하고 JavaScript 사양 에서 메소드를 (대부분?) 지원하는 64 비트 정수입니다 .
Niels van der Rest

1
@AboozarRajabi 389240타임 스탬프의 밀리 초입니다. Z에서 문자열 형식은 사용자가 제공 한 타임 스탬프가 UTC에 있음을 MongoDB를 알려줍니다. 그런 다음 다시 읽으면 응용 프로그램이 현지 시간대 로 변환 하여 시간이 변경된 것처럼 보일 수 있습니다. 그러나 시간은 여전히 ​​동일하며 다른 시간대 관점에서만 해석됩니다. 예를 들어 12:50:42Z13:50:42+01:00시간에 같은 순간을 나타냅니다.
Niels van der Rest 2

5
@AboozarRajabi 일반적으로 초기 입력이 정확하다면 저장 방법에 대해 걱정하고 싶지 않습니다 . 이 경우 21:56:03+01:00CET 바로 지금 삽입 new Date()한 후 MongoDB를은 수 대표20:56:03Z. 그러나 로컬 표준 시간대 설정 (CET)을 사용하여 다시 읽고 응용 프로그램에 표시하면 21:56:03다시 읽 습니다.
Niels van der Rest

53

하나의 날짜 스탬프가 이미 _id 객체에 있으며 삽입 시간을 나타냅니다.

따라서 삽입 시간이 필요한 경우 이미 있습니다.

mongodb 쉘에 로그인

ubuntu@ip-10-0-1-223:~$ mongo 10.0.1.223
MongoDB shell version: 2.4.9
connecting to: 10.0.1.223/test

항목을 삽입하여 데이터베이스를 작성하십시오.

> db.penguins.insert({"penguin": "skipper"})
> db.penguins.insert({"penguin": "kowalski"})
> 

그 데이터베이스를 우리가 지금있는 데이터베이스로 만들 수 있습니다

> use penguins
switched to db penguins

행을 다시 가져옵니다.

> db.penguins.find()
{ "_id" : ObjectId("5498da1bf83a61f58ef6c6d5"), "penguin" : "skipper" }
{ "_id" : ObjectId("5498da28f83a61f58ef6c6d6"), "penguin" : "kowalski" }

yyyy-MM-dd HH : mm : ss 형식으로 각 행을 가져옵니다.

> db.penguins.find().forEach(function (doc){ d = doc._id.getTimestamp(); print(d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate() + " " + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds()) })
2014-12-23 3:4:41
2014-12-23 3:4:53

마지막 한 줄짜리가 당신을 혼란스럽게한다면, 그것이 어떻게 작동하는지에 대한 연습이 있습니다 : https://stackoverflow.com/a/27613766/445131


18
그러나 문서가 db에 저장된 시간 소인이며 삽입 날짜와 관련이없는 날짜 및 시간을 저장하려는 경우가 있습니다.
Yuval A.

1
데이터베이스가 정말 빠르고 두 개의 문서가 동일한 밀리 초에 저장되어있는 경우 해당 문서는 동일 _id합니까?
Redsandro

10
@Redsandro 아니요, 그러나 잠재적으로 동일한 결과를 얻을 수 있습니다 _id.getTimestamp().
kmiyashiro

@ kmiyashiro, 그 타임 스탬프를 기준으로 정렬하는 방법을 알고 싶습니까?
ledlogic

1
신경 쓰지 마라. sort ({createdOn : -1); 에서 사용하는 방법입니다 stackoverflow.com/questions/28599237/...
ledlogic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.