我想知道是否有人知道如何按字符串长度对mongodb的find()
结果进行排序。
我尝试了类似于db.foo.find().sort({item.lenght:-1})
的操作,但显然不起作用。有人能帮帮我,并提供一种在pymongo中完成相同操作的方法吗?
我想知道是否有人知道如何按字符串长度对mongodb的find()
结果进行排序。
我尝试了类似于db.foo.find().sort({item.lenght:-1})
的操作,但显然不起作用。有人能帮帮我,并提供一种在pymongo中完成相同操作的方法吗?
有许多我个人希望在聚合框架中看到的东西(和基本API),例如:
仅举几例。
而这还没有使用“$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"值进行排序。
现在,在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所请求的操作,即返回“原样”但排序的文档。感谢提及。 - Neil Lunn