2015-02-09 7 views
25

मैं निम्नलिखित कुल क्वेरी चलाने के लिए एक मुद्दा हो रही है करने के लिए:अपवाद: BSON प्रकार ईओडी से परिवर्तित नहीं कर सकते तिथि

db.snippets.aggregate([ { '$project': { month: { '$month': '$created_at' }} } ]) 

उसी के लिए त्रुटि संदेश है:

assert: command failed: { 
     "errmsg" : "exception: can't convert from BSON type EOO to Date", 
     "code" : 16006, 
     "ok" : 0 } : aggregate failed 

कैसे क्या मैं इस मुद्दे के आसपास मिलता हूं। मैं एक संबंधित सवाल

Related Stack Overflow question

पाया लेकिन यह कैसे चीजें किया जाना बता नहीं करता है।

+0

यदि कोई यहां विपरीत की तलाश में है, उदाहरण के लिए। सभी दस्तावेजों में तिथि क्षेत्र में मिलीसेकंड हैं, इस पर एक नज़र डालें: http://stackoverflow.com/questions/29892152/convert-miliseconds-to-date-in-mongodb-aggregation-pipeline-for-group-by – Wtower

उत्तर

46

आप संभावना एक created_at मूल्य है कि एक BSON Date नहीं है के साथ एक या अधिक डॉक्स है और आपको लगता है कि ठीक करने के लिए Date को उन मूल्यों को परिवर्तित करने या उन्हें हटाने के द्वारा की आवश्यकता होगी।

आप एक $not क्वेरी की तरह $type ऑपरेटर का उपयोग करता है के साथ उन लोगों डॉक्स पा सकते हैं:

db.snippets.find({created_at: {$not: {$type: 9}}}) 

created_at मूल्यों तारीख तार कर रहे हैं, कि आप दस्तावेज़ों को अपडेट करते हुए की जरूरत है खोजने के लिए और उसके बाद में उन्हें अपडेट कर सकते हैं कोड का उपयोग करते हुए खोल:

db.snippets.find({created_at: {$not: {$type: 9}}}).forEach(function(doc) { 
    // Convert created_at to a Date 
    doc.created_at = new Date(doc.created_at); 
    db.snippets.save(doc); 
}) 
+4

आपने मेरा दिन आदमी मैं काफी समय से इस वजह से फंस गया था। – jsbisht

+0

@JohnnyHK क्या यह प्रश्न सिर्फ उन दस्तावेज़ों को नहीं ढूंढ पाएगा जिनके पास बीएसओएन तिथि नहीं है? मैं सभी गैर-बीएसओएन तिथियों को कैसे ढूंढ और अपडेट कर सकता हूं? – user137717

+1

@ user137717 extrapolate '.find (conditions)' '.update (शर्तों, अद्यतन) ' – bloudermilk

4

कुछ स्थितियों में, कुछ दस्तावेजों में खाली दिनांक फ़ील्ड होना चाहिए। उन मामलों में, आप (अपने उदाहरण का उपयोग करते हुए) यह कोशिश कर सकते: इस उदाहरण में

db.snippets.aggregate([ { '$project': { month: 
{ $cond: [{ $ifNull: ['$created_at', 0] }, { $month: '$created_at' }, -1] }} } ]) 

, हम मिलेगा -1 मामलों में जब भी कोई क्षेत्र '$ created_at' पाया जाता है। अन्य सभी मामलों के लिए, हमें तिथि माह मिलेगा।

1

इस कोशिश कीजिए, समस्या से ऊपर मेरे लिए इसकी सहायता।

db.snippets.aggregate([{ 
'$project': { 
    month: { $substr: ["$created_at", 5, 2] } 
} 
}]); 
कोड प्राप्त माह के ऊपर

बुद्धिमान

डेटा ISO प्रारूप में डेटाबेस जो तब आसानी के साथ काम किया जा सकता है में प्रवेश कर रहा है।

2

मुझे एक संबंधित समस्या थी, लेकिन मेरे मामले में दिनांक फ़ील्ड एक सरणी के सदस्य थे, इसलिए त्रुटि "बीएसओएन प्रकार ऑब्जेक्ट टू डेट को परिवर्तित नहीं कर सकती" थी।

मुझे संभवTripDateTimes सरणी में तिथियों से सप्ताह का दिन प्राप्त करने की आवश्यकता है।

नमूना दस्तावेज़:

{ 
"possibleTripDateTimes" : [ 
    { 
     "tripDateTime" : ISODate("2015-08-01T06:00:00.000-0700") 
    } 
] 
} 

ठीक बस सरणी सदस्य क्षेत्रों को संबोधित करने डॉट नोटेशन का इस्तेमाल किया गया।

db.trips.aggregate([ 
    { 
     $project: { 
     departTime: { 
      $map: { 
      input: "$possibleTripDateTimes.tripDateTime", 
      as: "dateTime", 
      in: { $dayOfWeek: "$$dateTime" } 
      } 
    } 
    } 
} 
] 
); 

मैं इस कोई है जो भी "BSON प्रकार ऑब्जेक्ट" पर हो जाता है शून्य खोज परिणामों में मदद करता है आशा है कि खोज

+0

अहह !! यह बहुत अच्छा है। आपने मुझे बहुत सारे बेवकूफ खोज घंटे बचाए! धन्यवाद दोस्त :) –

0

मैं एक ऐसी ही समस्या थी, और अगर तारीख से ही अस्तित्व में जाँच इसे हल।

db.users.aggregate([ 
{$project:{day: { $cond: ["$bd", { $dayOfMonth: "$bd" }, -1] }, 
      month: { $cond: ["$bd", { $month: "$bd" }, -1] }, 
      year: { $cond: ["$bd", { $year: "$bd" }, -1] } 
      }}, 
{$match:{"month":1, "day":15}} 
]) 

मेरे दिनांक फ़ील्ड bd है और वह मैच के साथ मैं 1 जनवरी को उनके जन्मदिन है कि सभी उपयोगकर्ताओं हो रही है।

0

मुझे एक ही समस्या थी, मुझे लगा कि रूपांतरण के असफल होने के कारण कुछ दस्तावेज़ों के लिए दिनांक फ़ील्ड गुम है। मैंने इन्हें फ़िल्टर करने के लिए अभी एक मैच क्लॉज जोड़ा है। लेकिन मैं अपने ऐप पक्ष पर जांच कर रहा हूं कि वे क्यों नहीं आ रहे हैं।

db.snippets.aggregate([ 
    { 
    '$match': { 
     'created_at': { 
     "$exists": true 
     } 
    } 
    }, 
    { 
    '$project': { 
     month: { 
     '$month': '$created_at' 
     } 
    } 
    } 
]) 
0

यह त्रुटि तब भी दिखाई दे सकती है जब आपने अपने डेटाबेस में जो कुछ भी किया है उसके संबंध में आपके गुणों में गलत तरीके से नामित किया है।

उदाहरण के लिए मेरी कोड

$group: { 
     _id: {$week: "$projects.timeStamp"}, 
     total: { $sum: "$projects.hours" } 
    } 

था लेकिन मैं अपने डेटाबेस में टाइमस्टैम्प camelcased नहीं था तो बस projects.timestamp यह तय करने के लिए संशोधित।

संबंधित मुद्दे

 संबंधित मुद्दे