วิธีที่ดีที่สุดในการจัดเก็บวันที่ / เวลาใน MongoB


177

ฉันเคยเห็นการใช้สตริงการประทับเวลาจำนวนเต็มและวัตถุวันที่และเวลา Mongo

คำตอบ:


200

วิธีที่ดีที่สุดคือการเก็บพื้นเมือง JavaScript วัตถุวันซึ่งแผนที่บนBSON วัตถุวันพื้นเมือง

> 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 วัดเป็นมิลลิวินาทีนับตั้งแต่ยุค Unix


9
ที่จะถูกเก็บไว้ในฐานข้อมูลอย่างไร เป็นวัตถุ datetime Mongo?
Thilo

2
@Thilo: MongoDB ไม่มีวัตถุ 'datetime' พิเศษเท่าที่ฉันรู้ มันใช้ประเภทวันที่ JavaScript ซึ่งเก็บไว้ในรูปแบบ BSON
Niels van der Rest

1
@Thilo: ถูกต้องนั่นคือการแสดง BSON ของวัตถุวันที่ JavaScript มันเป็นจำนวนเต็ม 64 บิตที่ร้านค้ามิลลิวินาทีตั้งแต่ยุค Unix และสนับสนุน (ส่วนใหญ่?) ของวิธีการจากการที่สเป JavaScript
Niels van der Rest

1
@AboozarRajabi 389และ240เป็นมิลลิวินาทีของการประทับเวลา Zในรูปแบบสตริงบอก MongoDB ที่ประทับเวลาที่คุณให้อยู่ใน UTC หากคุณอ่านกลับมาแอปพลิเคชันของคุณอาจแปลงเป็นเขตเวลาท้องถิ่นของคุณทำให้ดูเหมือนว่าเวลาจะเปลี่ยนไป แต่เวลายังคงเหมือนเดิม แต่จะตีความจากมุมมองเขตเวลาที่ต่างกันเท่านั้น ตัวอย่าง12:50:42Zและ13:50:42+01:00เป็นตัวแทนของช่วงเวลาเดียวกันในเวลา
Niels van der Rest

5
@AboozarRajabi โดยทั่วไปแล้วคุณไม่ต้องการที่จะเกี่ยวข้องกับวิธีการจัดเก็บตราบใดที่อินพุตเริ่มต้นถูกต้อง ถ้ามันเป็น21:56:03+01:00อยู่ในขณะนี้ใน CET และคุณใส่new Date()แล้ว MongoDB อาจหมายถึง20:56:03Zว่ามันเป็น แต่เมื่อคุณอ่านและแสดงในแอปพลิเคชันของคุณโดยใช้การตั้งค่าเขตเวลาท้องถิ่น (CET) มันจะอ่าน21:56:03อีกครั้ง
Niels van der Rest

53

มีหนึ่ง datestamp อยู่ในวัตถุ _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
ไม่เป็นไรเรียงลำดับ ({createdOn: -1); เป็นวิธีการใช้งานจากstackoverflow.com/questions/28599237/…
ledlogic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.