我想知道是否有人知道如何按字符串长度对 mongodb find()
结果进行排序。
我已经尝试过类似db.foo.find().sort({item.lenght:-1})
但显然不起作用。有人可以帮助我并建议我一种方法来做同样的事情,但在pymongo中?
我个人希望在聚合框架中看到很多东西(和基本的API),例如:
数学函数
- 对
- 数(如对数)
- 塞伊尔
- 地板
数组
- 和
字符串
- 长度
仅举几例。
这不会在"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 v3.4 +中使用$strLenBytes的聚合框架有一个解决方案。给定以下文档:
{_id: 0, name: "Bob"}
我们可以使用
db.mycollection.aggregate([{
$project: {
byteLength: {$strLenBytes: "$name"}
}
}])
这将返回 3 作为字节数。
不,实际上是不可能的。我正在处理一个类似的问题,我所做的是将每个对象的字符串长度存储为对象本身的属性。这绕过了问题。
如果您认为应该实施(我确实如此),我建议您在JIRA中对该问题投赞成票,由于某种原因,JIRA没有那么多票数:
https://jira.mongodb.org/browse/SERVER-5319