मोंगोडब में तारीख / समय स्टोर करने का सबसे अच्छा तरीका


177

मैंने स्ट्रिंग्स, पूर्णांक टाइमस्टैम्प और मोंगो डेटाइम वस्तुओं का उपयोग करते हुए देखा है।

जवाबों:


200

सबसे अच्छा तरीका देशी जावास्क्रिप्ट दिनांक वस्तुओं को स्टोर करना है , जो बीएसओएन मूल दिनांक वस्तुओं पर मैप करता है

> 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वस्तुओं को यूनिक्स टाइमस्टैम्प 1 से) में आसानी से बदल सकते हैं ।getTime()Date(milliseconds)

1) सख्ती से बोलना, यूनिक्स टाइमस्टैम्प सेकंड में मापा जाता है । जावास्क्रिप्ट तिथि ऑब्जेक्ट यूनिक्स युग के बाद से मिलीसेकंड में मापता है ।


9
यह डीबी में कैसे संग्रहीत किया जाएगा? एक आम के रूप में डेटाटाइम ऑब्जेक्ट?
थिलो

2
@ थिलो: मोंगोबडी में कोई विशेष 'डेटाइम' वस्तु नहीं है जहाँ तक मुझे पता है। यह जावास्क्रिप्ट दिनांक प्रकार का उपयोग करता है, जो कि BSON रूप में संग्रहीत होता है।
नील्स वैन डेर रेस्ट

1
@ थिलो: सही, यह मूल रूप से एक जावास्क्रिप्ट दिनांक ऑब्जेक्ट के बीएसओएन प्रतिनिधित्व है। यह एक 64-बिट पूर्णांक है जो यूनिक्स के युग के बाद से मिलीसेकंड को संग्रहीत करता है और जावास्क्रिप्ट विनिर्देश से विधियों का समर्थन करता है (अधिकांश?) ।
नील्स वैन डेर रेस्ट

1
@AboozarRajabi 389और 240टाइमस्टैम्प के मिलीसेकंड हैं। Zमें स्ट्रिंग प्रारूप MongoDB बताता है कि टाइमस्टैम्प आपके द्वारा दी गई यूटीसी में है। यदि आप इसे वापस पढ़ते हैं, तो आपका आवेदन संभवतः इसे आपके स्थानीय समयक्षेत्र में परिवर्तित कर देता है , जिससे ऐसा लगता है कि समय बदल गया है। लेकिन समय अभी भी वही है, यह केवल एक अलग समयक्षेत्र के दृष्टिकोण से व्याख्या की गई है। उदाहरण के लिए 12:50:42Zऔर 13:50:42+01:00समय में उसी क्षण का प्रतिनिधित्व करते हैं।
नील्स वैन डेर रेस्ट

5
@AboozarRajabi सामान्य तौर पर आप इस बात से चिंतित नहीं होना चाहते कि यह कैसे संग्रहीत किया जाता है, जब तक कि प्रारंभिक इनपुट सही है। यदि यह 21:56:03+01:00CET में अभी है और आप सम्मिलित करते हैं new Date(), तो MongoDB इसका प्रतिनिधित्व कर सकता है 20:56:03Z। लेकिन जब आप इसे वापस पढ़ते हैं और स्थानीय टाइमज़ोन सेटिंग्स (सीईटी) का उपयोग करके इसे अपने आवेदन में प्रदर्शित करते हैं, तो यह 21:56:03फिर से पढ़ेगा ।
नील्स वैन डेर रेस्ट

53

एक डेटास्टैम्प पहले से ही _id ऑब्जेक्ट में है, सम्मिलित समय का प्रतिनिधित्व करता है

तो अगर डालने का समय वह है जो आपको चाहिए, तो यह पहले से ही है:

मोंगोडब शेल में लॉगिन करें

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 में सहेजा गया था, कभी-कभी आप दिनांक और समय को सम्मिलित तिथि से संबंधित नहीं रखना चाहते हैं।
युवल ए।

1
यदि आपका डेटाबेस वास्तव में तेज है और दो दस्तावेज एक ही मिलीसेकंड में संग्रहीत हैं .. तो क्या उन दस्तावेजों में समान हैं _id?
रेडसंड्रो

10
@ रोदसन्द्रो नं, लेकिन संभावित रूप से इनका एक ही परिणाम हो सकता है _id.getTimestamp()
किमीयाशिरो

@kmiyashiro, क्या आपको पता होगा कि उस टाइमस्टैम्प के आधार पर कैसे छाँटना है?
ledlogic

1
कोई बात नहीं, सॉर्ट ({बनाया गया: -1); stackoverflow.com/questions/28599237/…
ledlogic
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.