2013-02-01 53 views

回答

4

天空是极限!不,实际上它是16 MB作为mongodb中的文档。这可以是记录中字符串的最大长度。

为了找到查询集的最大长度,你可以四处做这项工作:

  1. 与文本本身保持文本的长度在一起。
  2. 按照长度降序对结果集进行排序。
  3. 获取具有最大长度的第一个元素。
5

不幸的是,aggregation framework不支持在执行查询时自动将字符串转换为其长度的“len”运算符。所以你必须在你自己的代码中解决这个问题。你可以

  1. 使用MapReduce的函数来计算字符串长度
  2. 查询字符串,并计算应用层上它们的长度

这些方法之间的区别是数据库上的第一次运行而后者在你的应用服务器上运行。我会推荐后一种选择,因为MapReduce的使用速度可能非常慢并且很麻烦。

-1

与SQL不同,MongoDB并不真正知道字段的长度。它至多在索引时知道该字段不在1024字节之内。

因此,您可能必须修复客户端。你可以在这里使用$where,但如果你想这样做,我认为你看着这个错误。

你也可以在@Philipp使用和MR在这里,但是你也可能会在这里看到错误的东西。

MongoDB中的查询实际上是一个BSON文档。因此,查询集的最大长度(取决于您定义的“查询集”)总是16MB(目前)。

许多驱动程序提供了一种方法来将结构(散列或字典或其他)编码为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) 
)); 

响应将持有的map-reduce结果

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 

祝你好运,让我知道如果你需要一个不同的变种!