标准查询无法做到这一点,因为“排序”需要在文档中存在的物理字段上完成。做到这一点的最好方法是实际将您的“列表”计数作为文档中的另一个字段。这也使您的查询更加高效,并且可以索引“计数器”字段,因此基本查询变为(原始 MongoDB 语法):
{ "comLength": { "$gt": 6 } }
如果您不能或不想更改文档结构,那么按列表长度排序的唯一方法是通过.aggregate() $project 它:
ArticleModel._get_collection().aggregate([
{ "$match": { "com.6": { "$exists": true } }},
{ "$project": {
"com": 1,
"otherField": 1,
"comLength": { "$size": "$com" }
}},
{ "$sort": { "comLength": -1 } }
])
这认为您至少有 MongoDB 2.6 可以使用 $size 聚合运算符。如果不这样做,则必须 $unwind 和 $group 才能计算数组的长度:
ArticleModel._get_collection().aggregate([
{ "$match": { "com.6": { "$exists": true } }},
{ "$unwind": "$com" },
{ "$group": {
"_id": "$_id",
"otherField": { "$first": "$otherField" }
"com": { "$push": "$com" },
"comLength": { "$sum": 1 }
}},
{ "$sort": { "comLength": -1 } }
])
因此,如果您打算走这条路,那么请仔细查看文档,因为您可能不习惯原始的 MongoDB 语法,并且一直在使用 MongoEngine 提供的查询 DSL。
总体而言,只有.aggregate() 或.mapReduce() 中的聚合提供程序才能真正“创建文档中不存在的字段”。也没有测试可用于标准投影或文档排序的“当前”长度。
添加另一个字段并使其与实际数组长度保持同步的最佳选择。但如果上述内容未能向您展示一般方法。