2012-01-13 5 views
8

मैं मोंगोडीबी को कैसाबा के माध्यम से एक ऐसे क्षेत्र के लिए पूछने की कोशिश करता हूं जो एक regexp के साथ तारों की एक सरणी है।एक regexp मैच के लिए एक ऐरे [स्ट्रिंग] से कैसे पूछताछ करें?

उदाहरण के लिए:

मैं ips की एक सूची, कि खेतों ips में स्ट्रिंग के रूप में जमा हो जाती है के साथ एक Maschine की है। अब मैं उन सभी मशीनों को खोजना चाहता हूं जिनमें सबनेट 192.168 है।

मेरे लिए ऐसा लगता है कि मैं प्रत्येक प्रविष्टि पर लागू एक regexp के साथ एक सरणी से पूछताछ नहीं कर सकता और अगर प्रविष्टियों में से एक मशीन से मेल खाता है।

ऐसी कोई पूछताछ करने का कोई तरीका?

- फिक्स्ड

आपकी मदद के लिए धन्यवाद।

सबकुछ अब काम करता है। अंत में मुझे Casbah की एक सीमा के आसपास काम करने की ज़रूरत है, क्योंकि मुझे $ के साथ पूछताछ में शामिल होने की आवश्यकता है या Casbah regexp के साथ लापता प्रत्यारोपण के बारे में शिकायत करता है।

एक अतिरिक्त अन्य क्षेत्र के साथ एक रेगुलर एक्सप्रेशन सरणी क्वेरी के लिए मेरे अंतिम कोड है:

val regexp = ".*" + parameter + ".*" 
val nameQ = MongoDBObject("serverName" -> regexp.r) 
val ipsQ = MongoDBObject("ips" -> regexp.r) 
val bldr = MongoDBList.newBuilder 
bldr += ipsQ 
bldr += nameQ 
val query = MongoDBObject("$or" -> bldr.result.asDBObject) 
val result = find(query) 

यह सबसे अच्छा कोड और पैरामीटर का स्ट्रिंग संयोजन ठीक किया जाना आवश्यक नहीं है। लेकिन यह काम करता है :)

उत्तर

12

आप तथ्य यह है कि यह एक सरणी है अनदेखा कर सकते हैं:

> db.rx.insert({ "ips" : ["192.168.1.231", "192.168.2.231", "120.32.42.51"] }); 
> db.rx.find({ ips : /192./ }) 
{ "_id" : ObjectId("4f104f0183bfca7a48b60da1"), 
    "ips" : [ "192.168.1.231", "192.168.2.231", "120.32.42.51" ] } 

MongoDB हमेशा इस तरह बर्ताव करता है: अगर आप सिर्फ एक सामान्य क्षेत्र की तरह एक सरणी का इलाज है, यह अगर प्रत्येक सदस्य के आपरेशन लागू होगी और, एक मैच, माता-पिता दस्तावेज़ को एक मैच पर विचार करें।

0

देखें कि $elemMatch query operator आपके लिए काम करेगा या नहीं।

+0

मैंने इसे पहले से ही आजमाया है। $ elemMatch अपेक्षा करता है कि मेरे सरणी में कुंजी/मूल्य जोड़े हैं। लेकिन मेरे पास केवल साधारण स्ट्रिंग्स हैं। – Odo

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