在 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 中按字符串长度排序的主要内容,如果未能解决你的问题,请参考以下文章

mongodb, pymongo 查询

MongoDB pymongo模块

带有日期时间的 MongoDB / Pymongo 查询

MongoDB pymongo模块 插入数据

MongoDB/PyMongo:查询多个条件 - 意外结果

MongoDB Pymongo 问题