वास्तव में $type
. के लिए दस्तावेज़ीकरण में एक "गोचा" सूचीबद्ध है विशेष रूप से सरणियों के बारे में:
सरणियों पर लागू होने पर, $type निर्दिष्ट प्रकार के किसी भी आंतरिक तत्व से मेल खाता है। प्रक्षेपण के बिना इसका मतलब है कि यदि किसी तत्व का सही प्रकार है तो संपूर्ण सरणी मेल खाएगी। प्रक्षेपण के साथ, परिणामों में केवल अनुरोधित प्रकार के वे तत्व शामिल होंगे।
तो इसका मतलब है कि यह पता लगाने के बजाय कि "तत्व स्वयं" सरणी में है या नहीं, वास्तव में जो परीक्षण किया जा रहा है वह सरणी का "आंतरिक तत्व" है यह देखने के लिए कि यह किस प्रकार का है।
अब प्रलेखन स्वयं $where
. के साथ इस JavaScript परीक्षण का सुझाव देता है :
.find({ "$where": "return Array.isArray(this.author)" })
लेकिन मुझे लगता है कि यह बहुत भयानक है क्योंकि एक बेहतर तरीका है।
ट्रिक "डॉट नोटेशन" में है, जहां आप 0
. मांगते हैं सरणी का अनुक्रमणिका तत्व $exists
.find({ "author.0": { "$exists": true } })
जो सिर्फ मूल मामला है कि यदि "0 वां" तत्व मौजूद है तो फ़ील्ड मौजूद है और डेटा इसलिए एक सरणी है।
एक बार जब आप उस तार्किक आधार को समझ लेते हैं तो यह बहुत ही सरल परीक्षा होती है। केवल एक चीज जिसका मिलान नहीं किया जा सकता है वह है "वास्तव में खाली" सरणी, इस स्थिति में यदि आवश्यक हो तो आप जावास्क्रिप्ट विकल्प पर वापस आ सकते हैं। लेकिन यह वास्तव में एक इंडेक्स का उपयोग कर सकता है, इसलिए बाद वाले फॉर्म का उपयोग करना पसंद किया जाएगा।