【问题标题】:sort by string length in Mongodb/pymongo在 Mongodb/pymongo 中按字符串长度排序
【发布时间】:2014-05-19 15:37:33
【问题描述】:

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

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

【问题讨论】:

  • AFAIK mongodb 不支持对字符串长度的操作。例如,您不能查询字符串长度小于或大于某物的位置。我通常最终会为此任务编写一个 js 脚本。
  • 聚合函数怎么样?
  • @Dikesh 我真的希望这是一种可能性,但目前还没有。查看答案。

标签: mongodb sorting mapreduce aggregation-framework pymongo


【解决方案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 )并允许在响应中对发出的“键”值进行排序。

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 2015-01-16
      相关资源
      最近更新 更多