Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mongodb中选择字符串长度_Mongodb_String Length - Fatal编程技术网

在mongodb中选择字符串长度

在mongodb中选择字符串长度,mongodb,string-length,Mongodb,String Length,如何查询mongodb以查找特定字符串/文本字段的长度 如何找到查询集的最大长度?天空是极限!不,对于mongodb中的文档,实际上是16MB。这可以是记录中字符串的最大长度 为了找到查询集中的最大长度,您可以围绕以下问题进行操作: 将文本的长度与文本本身保持在一起 按长度降序排列结果集 获取具有最大长度的第一个元素 不幸的是,不支持“len”运算符在执行查询时自动将字符串转换为其长度。所以你必须用你自己的代码来解决这个问题。你可以 使用MapReduce函数计算字符串长度 在应用程序层上查询字

如何查询mongodb以查找特定字符串/文本字段的长度


如何找到查询集的最大长度?

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

为了找到查询集中的最大长度,您可以围绕以下问题进行操作:

  • 将文本的长度与文本本身保持在一起
  • 按长度降序排列结果集
  • 获取具有最大长度的第一个元素
  • 不幸的是,不支持“len”运算符在执行查询时自动将字符串转换为其长度。所以你必须用你自己的代码来解决这个问题。你可以

  • 使用MapReduce函数计算字符串长度
  • 在应用程序层上查询字符串并计算其长度

  • 这些方法之间的区别在于,前者在数据库上运行,而后者在应用程序服务器上运行。我建议使用后一种方法,因为MapReduce使用起来非常慢和麻烦。

    与SQL MongoDB不同,它并不真正知道字段的长度。最多在索引时,它知道字段是否在1024字节以下

    因此,您可能需要在客户端解决这个问题。你可以在这里使用
    $where
    ,但如果你想这样做,我认为你看错了

    你也可以在这里使用和MR,正如@Philipp所说的,但是你可能在这里查错了东西

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


    许多驱动程序提供了一种将结构(哈希、dict或其他)编码到BSON的方法,允许您判断编码字符串的长度以了解查询的大小。

    不如改用正则表达式

    > 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({$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(); { “游标”:“基本游标”, “isMultiKey”:错误, “n”:2548, “nscannedObjects”:88736, “未扫描”:88736, “nscannedObjectsAllPlans”:88736, “NSCanendallPlans”:88736, “扫描者”:错误, “indexOnly”:错误, “NYELDS”:1, “跳过”:0, “米利斯”:1523年, “指数边界”:{ }, “服务器”:“shuhaimac.local:27017” } >find({id://\w{7,16}/i}).count(); 2548 >find({id://\w{7,16}/i}).explain(); { “游标”:“B游标id_1多”, “isMultiKey”:错误, “n”:2548, “nscannedObjects”:2548, “未扫描”:88736, “NSCANNEDOBJECTS计划”:2548, “NSCanendallPlans”:88736, “扫描者”:错误, “indexOnly”:错误, “NYELDS”:0, “跳过”:0, “米利斯”:122, “指数边界”:{ “id”:[ [ "", { } ], [ /\w{7,16}/i, /\w{7,16}/i ] ] }, “服务器”:“shuhaimac.local:27017” } 所以,我希望这能有所帮助。:-)我也遇到了同样的问题——我花了一段时间才让地图还原功能正常工作

    $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
    

    祝你好运,如果你需要一个不同的变体,请告诉我

    Mongo 3.4
    开始,聚合运算符可用于获取字符串的长度:

    // { a: "Hello World" }
    // { a: "42" }
    // { a: "Hello World!" }
    db.collection.aggregate([{ $addFields: { length: { $strLenCP: "$a" } } }])
    // { a: "Hello World",  length: 11 }
    // { a: "42",           length: 2 }
    // { a: "Hello World!", length: 12 }
    
    为了通过a/stage获得所有文档的最大长度:


    这完全是不真实的:MongoDB完全知道字符串的长度,它是类型字符串的bson规范的一部分,前4个字节是字符串的长度。只是没有允许您查询的运算符。@AsyaKamsky应该在编写之前检查过规范
    // { a: "Hello World" }
    // { a: "42" }
    // { a: "Hello World!" }
    db.collection.aggregate([{ $addFields: { length: { $strLenCP: "$a" } } }])
    // { a: "Hello World",  length: 11 }
    // { a: "42",           length: 2 }
    // { a: "Hello World!", length: 12 }
    
    db.collection.aggregate([
      { $group: { _id: null, longest: { $max: { $strLenCP: "$a" } } } }
    ])
    // { "_id" : null, longest: 12 }