Mongodb'da tarih / saat depolamanın en iyi yolu


177

Ben dizeler, tamsayı zaman damgaları ve mongo datetime nesneleri kullanarak gördüm.

Yanıtlar:


200

En iyi yolu yerli JavaScript saklamaktır tarihi nesneleri üzerine map, BSON yerli tarihi nesneler .

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

Yerel tür , örneğin harita küçültme işlerinizde kullanabileceğiniz bir dizi kullanışlı yöntemi destekler .

Gerekirse , yöntemi kullanarak DateUnix zaman damgalarına 1) ve nesnelerini kolayca dönüştürebilirsiniz.getTime()Date(milliseconds) , sırasıyla yapıcıyı .

1) Açıkçası, Unix zaman damgası saniye cinsinden ölçülür . JavaScript Date nesnesi , Unix döneminden bu yana milisaniye cinsinden ölçer .


9
DB'de nasıl saklanacak? Bir mongo datetime nesnesi olarak?
Thilo

2
@Thilo: MongoDB'nin bildiğim kadarıyla özel bir 'datetime' nesnesi yok. BSON biçiminde saklanan JavaScript Tarih türünü kullanır.
Niels van der Rest

1
@Thilo: Doğru, temelde bir JavaScript Date nesnesinin BSON temsilidir. Unix döneminden bu yana geçen milisaniyeyi depolayan ve JavaScript belirtimindeki yöntemleri (en çok?) Destekleyen 64 bitlik bir tam sayıdır .
Niels van der Rest

1
@AboozarRajabi 389ve 240zaman damgasının milisaniyeleridir. Zİçinde dize biçiminde sağlanan damgası UTC olduğunu MongoDB söyler. Daha sonra tekrar okursanız, uygulamanız muhtemelen yerel saat diliminize dönüştürür ve zaman değişmiş gibi görünür. Fakat zaman hala aynı, sadece farklı bir saat dilimi perspektifinden yorumlanıyor. Örneğin 12:50:42Zve 13:50:42+01:00aynı anı temsil eder.
Niels van der Rest

5
@AboozarRajabi Genel olarak, ilk girdi doğru olduğu sürece, nasıl saklandığı ile ilgilenmek istemezsiniz . Eğer durum bu ise 21:56:03+01:00CET şu anda ve eklemek new Date(), daha sonra MongoDB olabilir temsil olarak 20:56:03Z. Ancak yerel saat dilimi ayarlarını (CET) kullanarak geri okuduğunuzda ve uygulamanızda görüntülediğinizde, 21:56:03tekrar okunur .
Niels van der Rest

53

Ekleme zamanını temsil eden bir tarih damgası _id nesnesinde zaten var

Ekleme süresi ihtiyacınız olan şeyse, zaten oradadır:

Mongodb Shell'e giriş yapın

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

Öğeler ekleyerek veritabanınızı oluşturun

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

Bu veritabanını şu anda bulunduğumuz veritabanı yapalım

> use penguins
switched to db penguins

Satırları geri alın:

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

Her satırı yyyy-AA-gg SS: dd: ss biçiminde alın:

> 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

Bu son tek katmanlı sizi karıştırırsa, bunun nasıl çalıştığına dair bir izlenimim var: https://stackoverflow.com/a/27613766/445131


18
Ancak, belgenin db'ye kaydedildiği zaman damgasıdır, bazen ekleme tarihi ile ilgili olmayan tarihleri ​​ve saatleri saklamak istersiniz.
Yuval A.27

1
Veritabanınız gerçekten hızlıysa ve iki belge aynı milisaniyede saklanıyorsa, bu belgeler aynı _idmıdır?
Redsandro

10
@Redsandro hayır, ancak potansiyel olarak aynı sonuca sahip olabilirler _id.getTimestamp().
kmiyashiro

@kmiyashiro, o zaman damgasına göre nasıl sıralanacağını biliyor musun?
ledlogic

1
Boşver, sırala ({createdOn: -1); stackoverflow.com/questions/28599237/… '
ledlogic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.