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

क्या मोंगोडब एकत्रीकरण पाइपलाइन में रेगेक्स का उपयोग करने की अनुमति देने के लिए कोई समाधान है

ऐसा लगता है कि यह प्रश्न कई बार बिना किसी समाधान के आता है। दो संभावित समाधान हैं जो मुझे पता हैं:समाधान 1- mapReduce का उपयोग करना। mapReduce एकत्रीकरण का सामान्य रूप है जो उपयोगकर्ता को कुछ भी कल्पनाशील और प्रोग्राम करने योग्य करने देता है।

mapReduce का उपयोग करके मोंगो शेल समाधान निम्नलिखित है, हम निम्नलिखित 'सेंट' संग्रह पर विचार करते हैं।

{ "_id" : ObjectId("51d6d23b945770d6de5883f1"), "foo" : "foo1", "bar" : "bar1" }
{ "_id" : ObjectId("51d6d249945770d6de5883f2"), "foo" : "foo2", "bar" : "bar2" }
{ "_id" : ObjectId("51d6d25d945770d6de5883f3"), "foo" : "foo2", "bar" : "bar22" }
{ "_id" : ObjectId("51d6d28b945770d6de5883f4"), "foo" : "foo2", "bar" : "bar3" }
{ "_id" : ObjectId("51d6daf6945770d6de5883f5"), "foo" : "foo3", "bar" : "bar3" }
{ "_id" : ObjectId("51d6db03945770d6de5883f6"), "foo" : "foo4", "bar" : "bar24" }

हम foo द्वारा समूह बनाना चाहते हैं, और प्रत्येक foo के लिए, doc की संख्या, साथ ही साथ 'bar2' सबस्ट्रिंग वाले बार वाले doc की संख्या गिनें। वह है:

foo1: nbdoc=1, n_match = 0
foo2: nbdoc=3, n_match = 2
foo3: nbdoc=1, n_match = 0
foo4: nbdoc=1, n_match = 1

ऐसा करने के लिए, निम्न मानचित्र फ़ंक्शन को परिभाषित करें

var mapFunction = function() {
  var key = this.foo;
  var nb_match_bar2 = 0;
  if( this.bar.match(/bar2/g) ){
    nb_match_bar2 = 1;
  }
  var value = {
    count: 1,
    nb_match: nb_match_bar2
  };

  emit( key, value );
};

और निम्न कार्य कम करें

var reduceFunction = function(key, values) {

  var reducedObject = {
    count: 0,
    nb_match:0
  };
  values.forEach( function(value) {
    reducedObject.count += value.count;
    reducedObject.nb_match += value.nb_match;
  }
  );
  return reducedObject;
};

मैपड्यूस चलाएँ और परिणाम को संग्रह map_reduce_result में संग्रहीत करें

db.st.mapReduce(mapFunction, reduceFunction, {out:'map_reduce_result'})
{
  "result" : "map_reduce_result",
  "timeMillis" : 7,
  "counts" : {
    "input" : 6,
    "emit" : 6,
    "reduce" : 1,
    "output" : 4
},
"ok" : 1,
}

अंत में, हम संग्रह map_reduce_result, voila! समाधान

> db.map_reduce_result.find()
{ "_id" : "foo1", "value" : { "count" : 1, "nb_match" : 0 } }
{ "_id" : "foo2", "value" : { "count" : 3, "nb_match" : 2 } }
{ "_id" : "foo3", "value" : { "count" : 1, "nb_match" : 0 } }
{ "_id" : "foo4", "value" : { "count" : 1, "nb_match" : 1 } }

समाधान 2 - दो अलग-अलग एकत्रीकरण और विलय का उपयोग करके मैं इस समाधान के लिए विवरण नहीं दूंगा क्योंकि कोई भी मोंगो उपयोगकर्ता इसे आसानी से कर सकता है। चरण 1:एकत्रीकरण करें, उस हिस्से को अनदेखा करें जिसमें योग के लिए रेगेक्स की आवश्यकता होती है। चरण 2:दूसरा एकत्रीकरण समूह बनाना चरण 1 में से एक के समान कुंजी पर। पाइपलाइन का चरण 1:नियमित अभिव्यक्ति का मिलान करें; चरण 2:पहले चरण की तरह ही कुंजी पर समूह बनाएं और प्रत्येक समूह में दस्तावेज़ की संख्या गिनें {$sum:1};चरण 3:चरण 1 और 2 के परिणाम को मर्ज करें:दोनों परिणामों में दिखाई देने वाली प्रत्येक कुंजी के लिए नया फ़ील्ड जोड़ें, यदि कुंजी दूसरे परिणाम में मौजूद नहीं है, तो नई कुंजी को 0 पर सेट करें।

वोइला! दूसरा समाधान।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. $ और/$ या के आधार पर फ़िल्टर करने के लिए MongoDB के लिए एकत्रीकरण का उपयोग कैसे करें?

  2. प्रतिकृति सेट मोंगो डोकर-लिखें

  3. मोंगोडीबी:अपडेट/अप्सर्ट बनाम इंसर्ट

  4. तर्क नोडज में एक स्ट्रिंग होना चाहिए

  5. सरणी मानों के लिए मिलान स्थिति कैसे लिखें?