2013-02-01 12 views
8

में स्ट्रिंग लंबाई का चयन करें आप किसी विशेष स्ट्रिंग/टेक्स्ट फ़ील्ड की लंबाई खोजने के लिए mongodb से कैसे पूछते हैं? इसके अतिरिक्त आप एक क्वेरी सेट की अधिकतम लंबाई कैसे प्राप्त करेंगे?mongodb

उत्तर

4

आकाश सीमा है! नहीं, वास्तव में यह में किसी दस्तावेज़ के लिए 16 MB है। यह रिकॉर्ड में एक स्ट्रिंग की अधिकतम लंबाई हो सकती है।

आदेश एक प्रश्न सेट में अधिकतम लंबाई खोजने के लिए, आप के आसपास यह काम कर सकते हैं:

  1. पाठ के साथ ही एक साथ पाठ की लंबाई रखें।
  2. लंबाई पर उतरने वाले अपने परिणाम सेट को क्रमबद्ध करें।
  3. पहला तत्व प्राप्त करें जिसमें अधिकतम लंबाई हो।
5

दुर्भाग्य से aggregation framework "लेन" ऑपरेटर का समर्थन नहीं करता है जब आप एक क्वेरी करते समय तारों को स्वचालित रूप से अपनी लंबाई में परिवर्तित कर देते हैं। तो आपको इसे अपने कोड में हल करना होगा। आप

  1. उपयोग एक MapReduce समारोह स्ट्रिंग लंबाई स्ट्रिंग्स के लिए
  2. क्वेरी की गणना और अनुप्रयोग परत पर उनकी लंबाई की गणना करने के सकता है

इन विधि के बीच अंतर यह है कि डेटाबेस पर पहला रन जबकि उत्तरार्द्ध आपके आवेदन सर्वर पर चलता है। मैं बाद के विकल्प की सिफारिश करता हूं, क्योंकि MapReduce बहुत धीमा और उपयोग करने के लिए बोझिल हो सकता है।

-1

एसक्यूएल मोंगोडीबी के विपरीत वास्तव में फ़ील्ड की लंबाई को नहीं जानता है। सबसे अधिक जब यह अनुक्रमित करता है तो यह जानता है कि फ़ील्ड या तो 1024 बाइट्स के नीचे है या नहीं।

जैसा कि ऐसा कुछ है, आपको शायद क्लाइंट पक्ष को ठीक करना होगा। आप यहां $where का उपयोग कर सकते हैं, लेकिन मुझे लगता है कि यदि आप ऐसा करना चाहते हैं तो आप यह गलत देख रहे हैं।

आप यहां @ फिलिप राज्यों के रूप में भी उपयोग और एमआर का उपयोग कर सकते हैं लेकिन फिर आप शायद यहां गलत चीज़ को देख रहे हैं।

मोंगोडीबी में एक प्रश्न वास्तव में एक बीएसओएन दस्तावेज है। एक क्वेरी सेट की अधिकतम लंबाई (जिसे आप "क्वेरी सेट" के रूप में परिभाषित करते हैं उसके आधार पर) हमेशा 16 एमबी (फिलहाल) होता है।

कई ड्राइवर बीएसओएन को एक संरचना (हैश या डैंक या जो भी) को एन्कोड करने के लिए एक माध्यम प्रदान करते हैं, जिससे आप अपनी क्वेरी के आकार को समझने के लिए एन्कोडेड स्ट्रिंग की लंबाई का न्याय करने की अनुमति देते हैं।

+5

यह केवल असत्य है: मोंगोडीबी तारों की लंबाई को बिल्कुल जानता है, यह प्रकार स्ट्रिंग के लिए बीएसएन स्पेक का हिस्सा है, पहले 4 बाइट स्ट्रिंग की लंबाई है। कोई ऑपरेटर नहीं है जो आपको इस पर पूछताछ करने की अनुमति देता है। –

+0

@AyayaKamsky मेला पर्याप्त लिखने से पहले spec की जांच करनी चाहिए – Sammaye

2

इसके बजाय नियमित अभिव्यक्ति का उपयोग कैसे करें।

 
> db.apps.find({$where:"(this.id.length gt 6) && (this.id.length lt 15) " }).count(); 
2548 
> db.apps.find({$where:" (this.id.length gt 6) && (this.id.length lt 15) " }).explain(); 
{ 
    "cursor" : "BasicCursor", 
    "isMultiKey" : false, 
    "n" : 2548, 
    "nscannedObjects" : 88736, 
    "nscanned" : 88736, 
    "nscannedObjectsAllPlans" : 88736, 
    "nscannedAllPlans" : 88736, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 1, 
    "nChunkSkips" : 0, 
    "millis" : 1523, 
    "indexBounds" : { 

    }, 
    "server" : "shuhaimac.local:27017" 
} 
 
> db.apps.find({id:/\w{7,16}/i}).count(); 
2548 
> db.apps.find({id:/\w{7,16}/i}).explain(); 
{ 
    "cursor" : "BtreeCursor id_1 multi", 
    "isMultiKey" : false, 
    "n" : 2548, 
    "nscannedObjects" : 2548, 
    "nscanned" : 88736, 
    "nscannedObjectsAllPlans" : 2548, 
    "nscannedAllPlans" : 88736, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 122, 
    "indexBounds" : { 
     "id" : [ 
      [ 
       "", 
       { 

       } 
      ], 
      [ 
       /\w{7,16}/i, 
       /\w{7,16}/i 
      ] 
     ] 
    }, 
    "server" : "shuhaimac.local:27017" 
} 
1

तो, मुझे आशा है कि इस मदद करता है। :-) मैं एक ही समस्या में भाग गया - और मुझे नक्शा पाने के लिए कुछ समय लगा - काम कम करने।

$response = $Mongo->yourdb->command(array(
    "mapreduce" => "yourcollection", 
    "map" => new MongoCode(" function() { emit(this.groupbykey, this.thestring.length); } "), 
    "reduce" => new MongoCode(" function(k, vals) { return Math.max.apply(null, vals); } "), 
    "query" => array("groupbykey" => "somevalue"), 
    "out" => array("inline" => 0) 
)); 

रिस्पांस नक्शा को कम परिणाम

Array 
(
    [results] => Array 
     (
      [0] => Array 
       (
        [_id] => groupbykeyvalue 
        [value] => 106 
       ) 

     ) 

    [counts] => Array 
     (
      [input] => 7341 
      [emit] => 7341 
      [reduce] => 76 
      [output] => 1 
     ) 

    [timeMillis] => 189 
    [timing] => Array 
     (
      [shardProcessing] => 171 
      [postProcessing] => 17 
     ) 

    [shardCounts] => Array 
     (
      [someshard:27017] => Array 

गुड लक का आयोजन करेगा, यदि आप एक अलग संस्करण की जरूरत है मुझे पता है!