2014-06-13 3 views
25

icCube के साथ एक मोंगोडीबी डेटा स्रोत बनाने की कोशिश कर रहा है। विचार एक सरणी के आकार को एक नए क्षेत्र के रूप में वापस करना है। कुछ की तरह:

$project: 
{ 
"people": 1, 
"Count myFieldArray" : {$size : "$myFieldArray" } 
} 

लेकिन मैं कुछ रिकॉर्ड के लिए निम्न त्रुटि हो रही है:

The argument to $size must be an Array, but was of type: EOO 

वहाँ एक रास्ता है कि आकार 0 यदि फ़ील्ड रिक्त है या नहीं एक सरणी है (हो रही से छुटकारा है त्रुटि) ?

उत्तर

55

आप यहां $ifNull ऑपरेटर का उपयोग कर सकते हैं। ऐसा लगता है क्षेत्र या तो एक सरणी नहीं सके या फिर गलती से मौजूद नहीं है:

{ "$project": { 
    "people": 1, 
    "Count": { 
     "$size": { "$ifNull": [ "$myFieldArray", [] ] } 
    } 
}} 

इसके अलावा, आप इस मामले में अपने $match में $type जांचने के लिए इन मौजूद हैं, लेकिन एक सरणी नहीं हैं करना चाहते हो सकता है।

+1

धन्यवाद यह बहुत काम करता है। अजीब है कि एक अपरिभाषित क्षेत्र का $ आकार 0 नहीं है (वास्तव में सभी सभी सरणी प्रकारों के लिए 0)। मैं उम्मीद करता हूं कि एक nonsql डीबी अधिक उदार होने के लिए (यदि एक मोंगो डीबी लड़का यह पढ़ता है :-)) – ic3

+2

@ ic3 वास्तव में नहीं, और यही कारण है कि '$ ifNull' मौजूद है। वही चेतावनी ऑपरेटरों पर लागू होती है जैसे '$ unwind' जहां आपको सावधान रहना होगा कि सरणी खाली नहीं है या गायब है अन्यथा आप या तो मूल दस्तावेज़ को हटाने या समान त्रुटि उत्पन्न करने का परिणाम देंगे। –

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