2013-02-20 14 views
16

मेरे संग्रहों में से एक के लिए, जो कि आयोडेट के बजाय यूनिक्स टाइमस्टैम्प बनी रहती है, मैं आमतौर पर टाइमस्टैम्प को नई तिथि (unix_timestamp) के साथ परिवर्तित करता हूं।

अब मुझे एकत्रीकरण में new Date(ts) की आवश्यकता है। , ('दिन' => '$ नई तिथि (टीएस)' (उदाहरण PHP में है)

'$ परियोजना' => सरणी ...

'$ समूह' => सरणी ("_ id" => सरणी ('दिन' => '$ दिन)', ...), ...

परिणामों में आने नहीं करता है। क्षेत्र "दिन" परिणाम में पूरी तरह से याद आ रही है ।

यह कैसे एकत्रीकरण के भीतर परिवर्तित करने के लिए?

उत्तर

3

विज्ञापन के लिए पारंपरिक गणना क्षेत्रों प्रक्षेपण में आप ऑपरेटर जोड़ने के लिए, इस तरह $ उपयोग करने की आवश्यकता: (कंसोल उदाहरण)

db.so.aggregate([{$project: {date: {$add: Date() }}}]) 

लेकिन यह गलत है और हम एक त्रुटि संदेश मिलता है:

exception: $add does not support strings (or dates) 

लेकिन मैं एक साधारण पाया हैक =)

db.so.aggregate([{$project: {date: {$substr: [Date(), 0, -1] }}}]) 

इस मामले में हम दिनांकों इसके अलावा के साथ अपेक्षित परिणाम होगा, पीएचपी उत्पादन में आप इस तरह त्रुटि देख सकते हैं:

exception: disallowed field type Date in object expression (at 'date') 

और अब, समाधान (php 5.4 वाक्य रचना):

$so->aggregate([ 
    ['$project' => ["date" => ['$substr' => [new MongoDate(), 0, -1]] ] ] 
]); 
+2

यह फ़ील्ड ts 'मान को परिवर्तित नहीं करता है एक मोंगो तिथि। यह केवल php स्ट्रिंग या संख्या को इनपुट के रूप में स्वीकार कर रहा है, न कि संग्रह से मूल्य:/ – ledy

+0

ओपीएस, क्षमा करें) इस मामले के लिए एकत्रीकरण के बजाय मानचित्र-कमी का उपयोग करना चाहिए? –

+0

@ किरीलज़ोरिन, यह शानदार है! सबस्ट्रेट केवल तारीख को प्रक्षेपित करने के लिए सही है, समय भाग छोड़ रहा है। यह बहुत उपयोगी है !! –

21

, दस्तावेज़ से एक टाइमस्टैम्प क्षेत्र को जोड़ने के लिए सक्षम होने के लिए आप यह कर सकते हैं, यह देखते हुए:

{"ts": 1400512120100} 

एक तिथि के रूप में एकत्र करने के लिए:

db.foo.aggregate({ 
    $project: { 
     date: { $add: [new Date(0), "$ts"] } 
    } 
}) 
+1

इससे मुझे बहुत मदद मिली! मेरे टाइमस्टैम्प सभी यूटीसी में हैं और मैं स्थानीय समय में कनवर्ट करना चाहता था। मैं इस दृष्टिकोण का उपयोग कर ऐसा करने में सक्षम था। {$ प्रोजेक्ट: {डीडी: {$ एड: [नई तिथि (0), {$ घटाएं: [{$ गुणा करें: ["$ items.ordered", 1000]}, tzoffset]}]}, ... –

+1

मुझे यह काम दिखाई देता है, लेकिन यहां क्या चल रहा है? बस '> नई तिथि (1400512120100) 'परिणाम, सही ढंग से,' ISODATE ("2014-05-19T15: 08: 40.100Z") में। लेकिन यदि आप '$ add' के बिना' $ प्रोजेक्ट' में 'नई तिथि() 'का उपयोग करने का प्रयास करते हैं, तो आपको' ऑब्जेक्ट एक्सप्रेशन में फ़ील्ड प्रकार की तारीख 'की अनुमति नहीं है। फिर भी इस उदाहरण के अनुसार स्पष्ट रूप से तारीखों को वापस किया जा सकता है। यदि आप '$ प्रोजेक्ट' में '$ जोड़ें: [नई तिथि (" $ ts ")]' का प्रयास करते हैं, तो आपको एक बड़ा नकारात्मक वर्ष मिलता है ('ISODate (" - 2 9 2275055-05-16T16: 47: 03.192Z ")')। डेटा प्रकारों को सही तरीके से प्रबंधित करने और त्रुटि के बिना 'ISODATE' को वापस करने के लिए' $ add' कैसे है? – duozmo

+0

@duozmo: मुझे लगता है कि सिर्फ 'नई तिथि() 'काम नहीं करता है कि पाइपलाइन शुरू होने से पहले' नई तिथि()' केवल एक बार निष्पादित की जाती है।केवल विशेष मोंगोडीबी "एकत्रीकरण ऑपरेटर" (जैसे '$ add',' $ trunc' आदि) प्रत्येक मान के लिए चलाए जाएंगे। इस प्रकार यदि आप एकत्रीकरण के दौरान एक तिथि बनाना चाहते हैं, तो आपको इन ऑपरेटरों में से एक का उपयोग करना होगा। चूंकि मोंगोडीबी में कोई ऑपरेटर 'मिलीसेकंड्स टोडेट' नहीं है, इसलिए आपको (एबी) '$ add' का उपयोग करना होगा)। – sleske