2015-01-13 5 views
11

मान लीजिए मैं इस तरह एक संग्रह है:मोंगो क्वेरी उप दस्तावेज़ के कई क्षेत्रों पर

{ "arr" : [ { "name" : "a", "num" : 1 }, { "name" : "a", "num" : 2 } ] }, 
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "a", "num" : 2 } ] }, 
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "b", "num" : 2 } ] } 

और मैं सभी दस्तावेजों जो arr है पता लगाना चाहते हैं एक name = "बी" और num के साथ सब-दस्तावेज़ = 2.

मैं इस तरह एक प्रश्न करते हैं:

db.collection.find({ 
    $and: [ 
     { "arr.name": "b" }, 
     { "arr.num": 2 } 
    ] 
}); 

यह संग्रह में सभी दस्तावेजों वापस आ जाएगी क्योंकि वे एक एक सु शामिल साथ बी-दस्तावेज़ या तो "बी" के एक name या 2.

के num मैं भी इस की कोशिश की है:

db.collection.find({ 
    arr: [ 
     { "name": "b", "num": 2 } 
    ] 
}); 

जो किसी भी त्रुटि फेंक नहीं है, फिर भी कोई फल प्राप्त नहीं करता है ।

आप MongoDB में एकाधिक उप-दस्तावेज़ फ़ील्ड पर कैसे पूछते हैं?

उत्तर

22

यह वास्तव में $elemMatch ऑपरेटर है, हालांकि इसका अक्सर दुरुपयोग होता है। यह अनिवार्य रूप से सरणी के भीतर "प्रत्येक तत्व" पर क्वेरी शर्तों को निष्पादित करता है। सभी MongoDB तर्क एक "और" आपरेशन जब तक स्पष्ट नहीं तो कहा जाता है:

db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } }) 

आप शायद यह भी करने के लिए "परियोजना" अगर आप केवल मिलान किया क्षेत्र और नहीं कि उम्मीद कर रहे हैं चाहते हैं यहाँ भी पूरे दस्तावेज़:

db.collection.find(
    { "arr": { "$elemMatch": { "name": "b", "num": 2 } } }, 
    { "arr.$": 1 } 
) 

अंत में समझाने के लिए क्यों अपने दूसरे प्रयास में काम नहीं करता है, इस क्वेरी:

db.collection.find({ 
    "arr": [ 
     { "name": "b", "num": 2 } 
    ] 
}) 

कुछ भी मेल नहीं खाता कोई वास्तविक करते है, क्योंकि अनुक्रम जहां "एआर" में आपकी परिस्थितियों से मेल खाने वाला एकवचन तत्व होता है।

आपका पहला उदाहरण में विफल रहा है ..:

db.collection.find({ 
    $and: [ 
     { "arr.name": "b" }, 
     { "arr.num": 2 } 
    ] 
}); 

क्योंकि वहाँ कई सरणी तत्वों कि शर्तों को पूरा करते हैं और इस बस नहीं माना जाता है कि दोनों की स्थिति एक ही तत्व पर लागू कर रहे हैं। यही है $elemMatch जोड़ता है, और जब आपको एक शर्त से मेल खाने की आवश्यकता होती है, तो यह वह जगह है जहां आप इसका उपयोग करते हैं।

+1

बहुत उपयोगी और पूरा उत्तर, खेद है कि दो बार ऊपर उठने में सक्षम न हो। धन्यवाद नील! – Moppo

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