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