在 Mongodb/pymongo 中按字符串长度排序
Posted
技术标签:
【中文标题】在 Mongodb/pymongo 中按字符串长度排序【英文标题】:sort by string length in Mongodb/pymongo 【发布时间】:2014-05-19 15:37:33 【问题描述】:我想知道是否有人知道如何按字符串长度对 mongodb find()
结果进行排序。
我尝试过类似db.foo.find().sort(item.lenght:-1)
的方法,但显然不起作用。有人可以帮助我并建议我在 pymongo 中做同样的事情吗?
【问题讨论】:
AFAIK mongodb 不支持对字符串长度的操作。例如,您不能查询字符串长度小于或大于某物的位置。我通常最终会为此任务编写一个 js 脚本。 聚合函数怎么样? @Dikesh 我真的希望这是一种可能性,但目前还没有。查看答案。 【参考方案1】:现在在 MongoDB v3.4+ 中有一个解决方案,使用使用 $strLenBytes 的聚合框架。给定以下文件:
_id: 0, name: "Bob"
我们可以使用
db.mycollection.aggregate([
$project:
byteLength: $strLenBytes: "$name"
])
这将返回 3 作为字节数。
【讨论】:
实际上应该是[ "$addFields": "len": "$strLenBytes": "$name" , "$sort": "len": 1 , "$project": "len": 0 ]
完全复制 OP 要求的操作,即“按原样”返回文档但已排序。不过值得一提。
@NeilLunn 是的,我只是专注于返回长度而不是排序,因为我觉得排序非常简单,随时更改答案以涵盖两者。【参考方案2】:
不,实际上是不可能的。 我正在处理类似的问题,我所做的是将每个对象的字符串长度存储为对象本身的属性。这绕过了问题。
如果您认为应该实施(我愿意),我建议您在 JIRA 中支持该问题,由于某种原因,该问题没有那么多投票:
https://jira.mongodb.org/browse/SERVER-5319
【讨论】:
【参考方案3】:我个人喜欢在聚合框架中看到很多东西(和基本 API),例如:
数学函数
log(如对数) 细胞 地板数组
总和字符串
长度仅举几例。
这不是在“ceil”和“floor”等情况下使用 $mod
运算符或其他方式的模糊用法。但我离题了。
您的“字符串长度”属于这一类。提出关于它的 JIRA 问题。但现在你可以使用mapReduce 和现有的 javascript 功能:
db.collection.mapReduce(
function()
emit( this.item.length, this.item );
,
function(key,values)
return values;
,
"out": "inline": 1
)
因此,虽然它确实具有“mapReduce”时髦风格,即返回一个重新整形的文档,并且当然所有内容都匹配一个数组中的相同长度,但它所做的是利用“mapReduce”的性质(不仅限于 MongoDB )并允许在响应中对发出的“键”值进行排序。
【讨论】:
以上是关于在 Mongodb/pymongo 中按字符串长度排序的主要内容,如果未能解决你的问题,请参考以下文章