2014-07-09 13 views
5

में दो फ़ील्ड के कॉन्सैट वैल्यू से मेल खाने वाले रिकॉर्ड का चयन करें क्या मोंगोडीबी पर ऐसा कुछ करने का कोई तरीका है?मोंगोड

select * from table where concat(field1, field2) = 'value' 

स्पष्ट करने के लिए, मैं पूरे नाम की एक सरणी है, लेकिन दस्तावेजों firstname और lastname अलग है, इसलिए मैं की तरह

select * from table where concat(firstname, lastname) in ([ARRAY OF NAMES]) 

उत्तर

13

आप एकत्रीकरण ढांचे के साथ यह केवल कर सकते हैं कुछ करना चाहता हूँ, नियमित खोज के साथ नहीं।

db.coll.aggregate({$project:{newField:{$concat:["$field1","$field2"]}}}, 
        {$match:{newField:"value"}} 
); 

ध्यान दें कि यह बाद से वहाँ MongoDB (अभी तक) की गणना मूल्यों पर अनुक्रमणिका के लिए कोई समर्थन नहीं है, किसी भी अनुक्रमित उपयोग करने में सक्षम नहीं होगा।

आप field1 पर एक सूचकांक है और आप जानते हैं कि कितने वर्ण आप आप इस तरह इस एकत्रीकरण के प्रदर्शन में सुधार कर सकते हैं value में योगदान के लिए फ़ील्ड 1 की आशा करते हैं:

db.coll.aggregate({$match:{field1:/^val/}}, 
        {$project:{newField:{$concat:["$field1","$field2"]}}}, 
        {$match:{newField:"value"}} 
); 

जहां val "मूल्य" का पहला हिस्सा है स्ट्रिंग (आप संस्करण 3.6 के रूप में field1 हालांकि की कम से कम मूल्य से अधिक पात्रों की तुलना नहीं करना चाहिए।

संपादित आपका उपयोग कर खोजने में कर सकते हैं 210 अभिव्यक्ति:

db.coll.find({$expr:{$eq:["value", {$concat:["$field1", "$field2"]}]}}) 
+1

बहुत बढ़िया, इस लगभग है कि मैं क्या जरूरत है: मेरे संपादन की जाँच, मैं कैसे बदल सकते हैं एक "इन (सरणी)" में $ मैच? – Deleteman

+2

एनवीएम, ऑपरेटर में $ पाया! – Deleteman

+0

मोंगोडब कुल में चेनिंग वह है जहां यह है! – Rohmer

4

तर्क ($ फ़ील्ड 1 या $ field2) अशक्त के एक मूल्य पर ले कर जाता है या एक क्षेत्र है कि याद आ रही है को संदर्भित करता है, तो $ concat अशक्त देता है। mongoDB3.0 के बाद से, एक नया $ ifNull अगर तर्क रिक्त है की जाँच करें और प्रदान करने के लिए प्रदान की जाती है एक वैकल्पिक

{ $ifNull: [ <expression>, <replacement-expression-if-null> ] } 

db.coll.aggregate({$project:{newField:{$concat:[{$ifNull:["$field1",""]},{$ifNull:["$field2",""]}]}}}, 
       {$match:{newField:"value"}}) 

अगर हम $ मैच प्रयोग कर रहे हैं परिणाम अलग नहीं हो सकता है, लेकिन इस परिणाम यदि आप चाहते हैं अलग अलग होंगे $ regex का उपयोग करें।

0

नेवला में आप कि

let clause = [            
      {$project:{name:{$concat["$first_name"," ","$last_name"]}}}, 
      {$match:{name:new RegExp("ab", 'i')}}      
     ];                    
Model.aggregate(clause) 

उत्पादन की तरह कर सकते हैं की तरह होगा कि

[ 
{ 
    "_id": "5911db2b9235272052fdd2e1", 
    "name": "Ali Abbas" 
}, 
{ 
    "_id": "5912f7dd8bdbc24aa37b5239", 
    "name": "Ali Abad" 
}, 
{ 
    "_id": "59229e0322abdb311818e419", 
    "name": "Syed Ali Abbas Shah" 
}, 
{ 
    "_id": "592837da188fa969cc135ddc", 
    "name": "Abu Akbar" 
} 

]

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