在Mongodb / pymongo中按字符串长度排序

时间:2014-04-07 11:52:28

标签: mongodb sorting mapreduce aggregation-framework pymongo

我想知道是否有人知道如何按字符串长度对mongodb find()结果进行排序。

我尝试了类似db.foo.find().sort({item.lenght:-1})的内容,但显然不起作用。有人可以帮助我,并建议我在pymongo做同样的事情吗?

3 个答案:

答案 0 :(得分:6)

我会亲自喜欢在聚合框架中看到很多东西(和基本的API),例如:

数学函数

  • log(如对数)
  • 小区
  • 地板

阵列

  • 总和

字符串

  • 长度

仅举几例。

在没有使用 $mod 运算符的模糊用法或其他方式,例如“ceil”和“floor”。但我离题了。

您的“字符串长度”属于此类别。提出有关它的JIRA问题。但是现在您可以使用mapReduce和现有的JavaScript功能:

db.collection.mapReduce(
    function() {
        emit( this.item.length, this.item );
    },
    function(key,values) {
        return values;
    },
    { "out": { "inline": 1 } }
)

因此,虽然确实有“mapReduce”时髦风格返回重新形状的文档,当然在数组中匹配相同长度的所有内容,它所做的是利用“mapReduce”的本质(不仅限于MongoDB)并允许在响应中对发出的“key”值进行排序。

答案 1 :(得分:5)

现在使用$strLenBytes使用聚合框架在MongoDB v3.4 +中有解决方案。鉴于以下文件:

select O.name as [Object_Name], C.text as [Object_Definition]
from sys.syscomments C
inner join sys.all_objects O ON C.id = O.object_id
--where C.text like '%table_name%'

我们可以使用

{_id: 0, name: "Bob"}

将返回3作为字节数。

答案 2 :(得分:0)

不,实际上是不可能的。 我正在处理类似的问题,我所做的是将每个对象的字符串长度存储为对象本身的属性。这绕过了问题。

如果你认为应该实施(我这样做),我建议你在JIRA中提出这个问题,因为某些原因没有那么多的选票:

https://jira.mongodb.org/browse/SERVER-5319