Mongo按数组长度排序

Evg*_*ius 40 size sql-order-by mongodb

让我们说我有像这样的mongo文件:

问题1

{
    answers:[
       {content: 'answer1'},
       {content: '2nd answer'}
    ]
}
Run Code Online (Sandbox Code Playgroud)

问题2

{
    answers:[
       {content: 'answer1'},
       {content: '2nd answer'}
       {content: 'The third answer'}
    ]
}
Run Code Online (Sandbox Code Playgroud)

有没有办法根据答案的大小来订购集合?

经过一些研究后,我看到了添加另一个字段的建议,其中包含了许多答案并将其用作参考,但可能有本地方法可以做到这一点?

Eve*_*man 47

我以为你可以使用$size,但这只是找到一定大小的数组,而不是排序.

来自mongo文档:http: //www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

您不能使用$ size来查找一系列大小(例如:具有多于1个元素的数组).如果需要查询范围,请创建一个额外的大小字段,在添加元素时递增.索引不能用于查询的$ size部分,但如果包含其他查询表达式,索引可用于搜索查询表达式的该部分的匹配项.

看起来您可以使用新的聚合框架轻松地完成此操作,编辑:尚未完成. http://www.mongodb.org/display/DOCS/Aggregation+Framework

立即更新聚合框架已经结束......

> db.test.aggregate([
  {$unwind: "$answers"}, 
  {$group: {_id:"$_id", answers: {$push:"$answers"}, size: {$sum:1}}}, 
  {$sort:{size:1}}]);
{
"result" : [
    {
        "_id" : ObjectId("5053b4547d820880c3469365"),
        "answers" : [
            {
                "content" : "answer1"
            },
            {
                "content" : "2nd answer"
            }
        ],
        "size" : 2
    },
    {
        "_id" : ObjectId("5053b46d7d820880c3469366"),
        "answers" : [
            {
                "content" : "answer1"
            },
            {
                "content" : "2nd answer"
            },
            {
                "content" : "The third answer"
            }
        ],
        "size" : 3
    }
  ],
  "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)


Ole*_*leg 34

我正在使用$ project:

db.test.aggregate([
    {
        $project : { answers_count: {$size: { "$ifNull": [ "$answers", [] ] } } }
    }, 
    {   
        $sort: {"answers_count":1} 
    }
    ])
Run Code Online (Sandbox Code Playgroud)

它还允许包含空答案的文档.但也有缺点(或有时候有优势):你应该在项目步骤中手动添加所有需要的字段.

  • 从3.4开始,mongo提供`$ addFields`阶段作为`$ project`的替代,以防你想要包含源文档的所有字段.https://docs.mongodb.com/v3.4/reference/operator/aggregation/addFields/ (4认同)

bha*_*ara 9

您可以使用 mongodb 聚合阶段$addFields,它将添加额外的字段来存储计数,然后是$sort阶段。

db.test.aggregate([
    {
        $addFields: { answers_count: {$size: { "$ifNull": [ "$answers", [] ] } } }
    }, 
    {   
        $sort: {"answers_count":1} 
    }
])
Run Code Online (Sandbox Code Playgroud)


小智 8

您可以使用$size属性按数组长度排序。

db.getCollection('test').aggregate([
{$project: { "answers": 1, "answer_count": { $size: "$answers" } }},
{$sort: {"answer_count": -1}}])
Run Code Online (Sandbox Code Playgroud)