आपने अपने टैग में इसका लगभग स्वयं उत्तर दिया है। MongoDB में एक $regex
है ऑपरेटर जो एक नियमित अभिव्यक्ति को एक प्रश्न के रूप में प्रस्तुत करने की अनुमति देता है। तो आप "एलेक्स" युक्त स्ट्रिंग्स के लिए क्वेरी करते हैं, आप ऐसा करते हैं:
Books.find(
{ "authors": { "$regex": "Alex", "$options": "i" } },
function(err,docs) {
}
);
आप यह भी कर सकते हैं:
Books.find(
{ "authors": /Alex/i },
function(err,docs) {
}
);
दस्तावेज़ में दिखाए गए अनुसार सही समर्थित सिंटैक्स में आपने जिस तरह से प्रयास किया, दोनों मान्य और भिन्न हैं।
लेकिन निश्चित रूप से यदि आप वास्तव में पूछ रहे हैं कि "सरणी' परिणाम केवल उन लोगों के लिए कैसे प्राप्त करें जो स्ट्रिंग में कहीं 'एलेक्स' से मेल खाते हैं?" तो यह थोड़ा अलग है।
एक . से अधिक के लिए जटिल मिलान array एलिमेंट एग्रीगेशन फ्रेमवर्क का डोमेन है (या संभवतः mapReduce, लेकिन यह बहुत धीमा है), जहां आपको ऐरे कंटेंट को "फ़िल्टर" करने की आवश्यकता होती है।
आप बहुत कुछ उसी से शुरू करते हैं। यहां कुंजी है $unwind
अलग-अलग दस्तावेज़ों के रूप में ठीक से "फ़िल्टर" करने में सक्षम होने के लिए सरणी सामग्री को "डी-सामान्यीकृत" करने के लिए। फिर "मिलान" दस्तावेज़ों के साथ सरणी का पुन:निर्माण करें।
Books.aggregate(
[
// Match first to reduce documents to those where the array contains the match
{ "$match": {
"authors": { "$regex": "Alex", "$options": i }
}},
// Unwind to "de-normalize" the document per array element
{ "$unwind": "$authors" },
// Now filter those document for the elements that match
{ "$match": {
"authors": { "$regex": "Alex", "$options": i }
}},
// Group back as an array with only the matching elements
{ "$group": {
"_id": "$_id",
"title": { "$first": "$title" },
"authors": { "$push": "$authors" },
"subjects": { "$first": "$subjects" }
}}
],
function(err,results) {
}
)