2013-02-01 27 views

答えて

4

空が限界です!いいえ、実際にはmongodbの文書の場合は16 MBです。これは、レコード内の文字列の最大長にすることができます。

問合せセットで最大の長さを見つけるために、あなたの周り、この作業を行うことができます。

  1. テキスト自体と一緒にテキストの長さにしてください。
  2. 結果セットを長さに応じて降順に並べ替えます。
  3. 最大長を持つ最初の要素を取得します。
5

残念ながら、aggregation frameworkでは、クエリ実行中に自動的に文字列を長さに変換する "len"演算子はサポートされていません。したがって、あなた自身のコードでこれを解決する必要があります。あなたは

  1. 使用のMapReduce関数は、文字列は、文字列の
  2. クエリを長計算し、アプリケーション層の上にその長さを計算することができ

これらの方法の違いは、データベース上の最初の実行後者はアプリケーションサーバー上で動作します。 MapReduceは非常に遅くて扱いにくいので、後者のオプションをお勧めします。

-1

SQL MongoDBとは異なり、フィールドの長さは実際には分かりません。索引付けするときは、フィールドが1024バイト以下かどうかを知ることがほとんどです。

このように、これはおそらくクライアント側を修正する必要があります。ここでは$whereを使うことができますが、もしあなたがそれをしたいのであれば、あなたはこれを間違って見ていると思います。

ここでもMRを@Philippの州として使うことができますが、ここでもおそらく間違ったことを考えています。

MongoDBのクエリは、実際にはBSONドキュメントです。したがって、クエリセットの最大長( "クエリセット"として定義するものに依存します)は、常に16MBです(現時点では)。

多くのドライバは、構造体(ハッシュまたはdictなど)をBSONにエンコードする手段を提供し、エンコードされた文字列の長さを判断してクエリのサイズを理解できるようにします。

+5

これは単に真実ではありません。MongoDBは文字列の長さを絶対に知っています。これはタイプ文字列のbson仕様の一部です。最初の4バイトは文字列の長さです。あなたがそれを照会できる演算子はありません。 –

+0

@AsyaKamskyフェアそれを書く前に十分に仕様をチェックしておいたはずです – 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

だから、私はこのことができます願っています。 :-)私は同じ問題に遭遇しました - そして、map-reduceを動作させるにはしばらく時間がかかりました。

$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 

マップ-減らす結果を開催します!

関連する問題