Mongodb/pymongo中按字符串长度排序
我想知道是否有人知道如何按字符串长度对mongodbMongodb/pymongo中按字符串长度排序,mongodb,sorting,mapreduce,aggregation-framework,pymongo,Mongodb,Sorting,Mapreduce,Aggregation Framework,Pymongo,我想知道是否有人知道如何按字符串长度对mongodbfind()结果进行排序 我尝试过类似于db.foo.find().sort({item.lenght:-1})的方法,但显然不起作用。有人能帮助我,并建议我一种方法来做同样的事情,但在pymongo?我个人喜欢在聚合框架中看到很多东西(和基本API),例如: 数学函数 对数(如对数) 细胞 地板 排列 总数 一串 长度 仅举几个例子 也就是说,在诸如“ceil”和“floor”这样的情况下,不必使用$mod操作符或其他手段的模糊用
find()
结果进行排序
我尝试过类似于db.foo.find().sort({item.lenght:-1})
的方法,但显然不起作用。有人能帮助我,并建议我一种方法来做同样的事情,但在pymongo?我个人喜欢在聚合框架中看到很多东西(和基本API),例如:
数学函数
- 对数(如对数)
- 细胞
- 地板
- 总数
- 长度
$mod
操作符或其他手段的模糊用法。但我离题了
您的“字符串长度”属于此类别。提出一个关于它的JIRA问题。但现在您可以使用和使用现有的JavaScript功能:
db.collection.mapReduce(
函数(){
发射(this.item.length,this.item);
},
功能(键、值){
返回值;
},
{“out”:{“inline”:1}
)
因此,虽然它确实具有“mapReduce”的时髦风格,即返回一个重新成形的文档,当然数组中的所有内容都匹配相同的长度,但它所做的是利用“mapReduce”的特性(不仅限于MongoDB),并允许在响应中对发出的“key”值进行排序。No,其实是不可能的。 我正在处理一个类似的问题,我所做的是将每个对象的字符串长度存储为对象本身的属性。这绕过了问题 如果你认为应该实施(我同意),我建议你在吉拉投票,因为某些原因,吉拉没有那么多选票:
在MongoDB v3.4+中,现在有了一个解决方案,使用聚合框架。鉴于以下文件:
{_id: 0, name: "Bob"}
我们可以使用
db.mycollection.aggregate([{
$project: {
byteLength: {$strLenBytes: "$name"}
}
}])
它将返回3作为字节数。AFAIK mongodb不支持对字符串长度的操作。例如,当字符串长度小于或大于某个值时,不能进行查询。我通常会为此任务编写一个js脚本。聚合函数呢?@Dikesh我真的希望这是可能的,但目前不是。看到答案了。实际上应该是
[{“$addFields”:{“len”:{“$strLenBytes”:“$name”}},{“$sort”:{“len”:1},{“$project”:{“len”:0}]
以完全复制OP请求的操作,该操作返回“原样”但已排序的文档。值得一提。@NeilLunn是的,我只是专注于返回长度,而不是排序,因为我觉得排序非常直接,请随意更改答案以涵盖两者。