2011-04-08 10 views
6

मैं निम्नलिखित का उपयोग दस्तावेज़ स्कीमा काम नहीं करता:MongoDB क्वेरी

//User Document 
{ 
    "_id": "0610457c-b25b-4e73-b859-11987a3fe271", 
    "FirstName": "Some Name", 
    "LastName": "surname", 
    // it is array of ledger items 
    "LedgerBook": [ 
      { 
       "AccountId": "aadfgdf6319d3-1a12-4575-9776-c6653sdfg5c32527", 
       "TransactionId": "ef98bbc4-3efb-46dc-b632-5adfgdfg1fcc378446", 
       .... 
      }, 
      ... 
     ] 

और जब मैं क्वेरी db.users.find({ "LedgerBook" : { "$type" : 4 } }).limit(50); यह कुछ भी नहीं देता है लागू करने का प्रयास है, लेकिन क्वेरी के लिए db.users.find({ "LedgerBook" : { "$type" : 3 } }).limit(50); अच्छी तरह से काम (सभी दस्तावेजों है कि वापसी लेजरबुक आइटम)।

ऐसा क्यों होता है?

टाइप = 4 ऐरे और टाइप = 3 ऑब्जेक्ट है।

मैं उन सभी दस्तावेजों को प्राप्त करना चाहता हूं जिनमें कम से कम एक लेजरबुक आइटम है।

उत्तर

8

जब आप किसी सरणी के खिलाफ क्वेरी करते हैं तो परीक्षण अवधारणात्मक रूप से सरणी के प्रत्येक तत्व पर लागू होता है जब तक यह तत्वों में से किसी एक के लिए सत्य नहीं लौटाता, या सरणी के अंत तक पहुंच जाता है ।

तो क्वेरी:

db.items.find({ LedgerBook : { $type : 4 }}) 

वास्तव में मतलब है: सभी दस्तावेजों को खोजने जहां LedgerBook सरणी के मदों की कम से कम एक अपने आप में एक सरणी है। भले ही लेजरबुक स्वयं एक सरणी है, इसके तत्वों में से कोई भी नहीं है, इसलिए कोई दस्तावेज़ क्वेरी से मेल नहीं खाता है।

तुम सिर्फ दस्तावेजों एक LedgerBook तत्व आप उपयोग कर सकते हैं कि के लिए क्वेरी करना चाहते हैं:

db.items.find({ LedgerBook : { $exists : true }}) 
+0

पहली क्वेरी behaivor मेरे लिए अजीब लग रहा है। मैं मूल दस्तावेज़ के भीतर लेजरबुक के प्रकार की जांच कैसे कर सकता हूं? इसके अलावा @Andrei उन सभी दस्तावेजों को चाहते हैं जो लेजरबुक को आइटम से 1 से अधिक मानते हैं। लेकिन आपकी दूसरी क्वेरी लेजरबुक का उल्लंघन करने वाले सभी दस्तावेज लौटाती है (भले ही सरणी आइटम बराबर 0 के बराबर हों)। –

+0

यह है कि सरणी के काम के खिलाफ सवाल कैसे हैं। शायद अजीब लग सकता है, लेकिन ज्यादातर समय यह वही है जो आप चाहते हैं। लेजरबुक सरणी के लिए 1 या अधिक प्रविष्टियों के साथ परीक्षण करने के लिए आपको $ $ का उपयोग करना होगा जहां क्लॉज: –

+3

> db.items.find ({$ जहां: function() {इसे वापस करें। लेजरबुक उदाहरण Array && this.LedgerBook.length > 0;}}) –

2

यह एक बग की तरह लगता है, मैंने mongovue से { "Array" : { $type : 4 } } चलाने की कोशिश की है और यह मेरे लिए भी काम नहीं करता है। mongoshell में जांच करने के लिए ...

जा रहे हैं लेकिन आप इसे इस तरह से कर सकते हैं अगर आप कम से कम एक आइटम के साथ सभी नेस्टेड सरणी जानना चाहता हूँ:

db.users.find({ "LedgerBook.0.AccountId" : { $exists : true } }) 

अद्यतन: कोड भी में कुछ भी नहीं लौटने के बाद mongoshell, तो मुझे लगता है कि यह बग है ..

db.items.find({ "Array" : { $type : 4 } }) 
6

एक सरणी का $ प्रकार इसकी पहली वस्तु के प्रकार के माध्यम से परिभाषित किया गया है। इसे एक बग या एक सुविधा कहते हैं। जिरा को पोस्ट किया गया कुछ मुद्दा है ...

+0

आप एक बग/सुविधा के लिए लिंक दे कृपया कर सकते हैं। यह मेरे लिए एक बग जैसा दिखता है ... किसी भी तरह से इसे इंगित करने के लिए धन्यवाद। +1 –

+0

https://jira.mongodb.org/browse/SERVER-1475 –

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