2017-04-25 11 views
5

यहां मेरा मोंगोडीबी खोल सत्र है;मोंगोडीबी रेगेक्स मिलान समस्या

> db.foo.save({path: 'a:b'}) 
WriteResult({ "nInserted" : 1 }) 

> db.foo.findOne() 
{ "_id" : ObjectId("58fedc47622e89329d123ee8"), "path" : "a:b" } 

> db.foo.save({path: 'a:b:c'}) 
WriteResult({ "nInserted" : 1 }) 

> db.foo.find({path: /a:[^:]+/}) 
{ "_id" : ObjectId("58fedc47622e89329d123ee8"), "path" : "a:b" } 
{ "_id" : ObjectId("58fedc57622e89329d123ee9"), "path" : "a:b:c" } 

> db.foo.find({path: /a:[a-z]+/}) 
{ "_id" : ObjectId("58fedc47622e89329d123ee8"), "path" : "a:b" } 
{ "_id" : ObjectId("58fedc57622e89329d123ee9"), "path" : "a:b:c" } 

जाहिर regex /a:[^:]+/ और /a:[a-z]+/ स्ट्रिंग 'a:b:c' से मेल नहीं करना चाहिए, लेकिन मोंगो तरह लग रहा है इस regex पर विफल रहा है, किसी को पता है कि यहां क्या हुआ?

इसे मोंगो डीबी जिरा, as a bug ticket पर सबमिट किया गया था, तो क्या यह मोंगोडीबी पूछताछ संरचना के भीतर एक बग है?

उत्तर

8

समस्या आंशिक मिलान के साथ है, क्योंकि आप पूरे शब्द के लिए रेगेक्स को प्रतिबंधित नहीं कर रहे हैं, आंशिक मिलान a:b:c में मौजूद है जो a:b है जिसके परिणामस्वरूप आपको वह दस्तावेज़ मिल रहा है।

^$ के साथ निम्न रेगेक्स का उपयोग करें जो कि शुरुआत और शब्द के अंत का प्रतिनिधित्व करने के लिए एंकर हैं;

db.foo.find({path: /^a:[^:]+$/}) 
db.foo.find({path: /^a:[a-z]+$/}) 

इस regex पूरी स्ट्रिंग के लिए आवेदन करते हैं, और आंशिक मिलान उपेक्षा जैसा कि ऊपर बताया जाएगा। रेगेक्स एंकर पर अधिक जानकारी के लिए, click here

तो संक्षेप में, कोई बग नहीं है, केवल रेगेक्स का दुरुपयोग है।

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