MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB:$regex . के साथ $cond का उपयोग करके एकत्रीकरण

अद्यतन करें: MongoDB v4.1.11 से शुरू होकर, अंत में आपकी समस्या के लिए एक अच्छा समाधान प्रतीत होता है जो प्रलेखित है यहाँ

मूल उत्तर:

जैसा कि मैंने उपरोक्त टिप्पणियों में लिखा है, $regex $cond . के अंदर काम नहीं करता है इस समय। एक खुला JIRA टिकट है उसके लिए लेकिन यह, ग़लती से, ठीक है, खुला है...

आपके विशिष्ट मामले में, मैं आपको क्लाइंट पक्ष पर उस विषय को हल करने का सुझाव दूंगा जब तक कि आप पागल मात्रा में इनपुट डेटा से निपट नहीं रहे हैं, जिसमें से आप हमेशा छोटे सबसेट लौटाएंगे। आपकी क्वेरी को देखते हुए ऐसा प्रतीत होगा कि आप हमेशा दो परिणाम समूहों ("हां" और "नहीं") में बकेट किए गए सभी दस्तावेज़ों को पुनः प्राप्त करने जा रहे हैं।

यदि आप क्लाइंट साइड पर उस विषय को हल नहीं करना चाहते हैं या नहीं कर सकते हैं, तो यहां कुछ ऐसा है जो $पहलू (MongoDB>=v3.4 आवश्यक) - यह न तो विशेष रूप से तेज़ है और न ही अत्यधिक सुंदर है, लेकिन यह आपको आरंभ करने में मदद कर सकता है।

db.captions.aggregate([{
    $facet: { // create two stages that will be processed using the full input data set from the "captions" collection
        "CallToActionYes": [{ // the first stage will...
            $match: { // only contain documents...
                "plainText": /leave\sa\scomment/i // that are allowed by the $regex filter (which could be extended with multiple $or expressions or changed to $in/$nin which accept regular expressions, too)
            }
        }, {
            $addFields: { // for all matching documents...
                "CallToAction": "Yes" // we create a new field called "CallsToAction" which will be set to "Yes"
            }
        }],
        "CallToActionNo": [{ // similar as above except we're doing the inverse filter using $not
            $match: {
                "plainText": { $not: /leave\sa\scomment/i }
            }
        }, {
            $addFields: {
                "CallToAction": "No" // and, of course, we set the field to "No"
            }
        }]
    }
}, {
    $project: { // we got two arrays of result documents out of the previous stage
        "allDocuments" : { $setUnion: [ "$CallToActionYes", "$CallToActionNo" ] } // so let's merge them into a single one called "allDocuments"
    }
}, {
    $unwind: "$allDocuments" // flatten the "allDocuments" result array
}, {
    $replaceRoot: { // restore the original document structure by moving everything inside "allDocuments" up to the top
        newRoot: "$allDocuments"
    }
}, {
    $project: { // include only the two relevant fields in the output (and the _id)
        "videoId": 1,
        "CallToAction": 1
    }
}])

हमेशा एकत्रीकरण ढांचे के साथ, यह पाइपलाइन के अंत से अलग-अलग चरणों को हटाने में मदद कर सकता है और प्रत्येक व्यक्तिगत चरण क्या करता है इसकी समझ प्राप्त करने के लिए आंशिक क्वेरी चला सकता है।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. आप आधिकारिक C# ड्राइवर का उपयोग करके mongoDB में SQL लाइक ऑपरेटर कैसे करते हैं?

  2. जावास्क्रिप्ट में MongoDB आईडी को छोटा करें

  3. MongoDB सरणी तत्वों द्वारा दस्तावेज़ों को सॉर्ट करता है

  4. उत्पादों, विकल्पों/टैग और श्रेणियों को सहेजना, व्यवस्थित करना और क्वेरी करना

  5. सी # ड्राइवर के साथ मोंगोडीबी में शब्दकोश डालें