蒙戈为了通过阵列的长度

问题描述 投票:38回答:3

可以说我有这样的蒙戈文件:

问题1

{
    answers:[
       {content: 'answer1'},
       {content: '2nd answer'}
    ]
}

问题2

{
    answers:[
       {content: 'answer1'},
       {content: '2nd answer'}
       {content: 'The third answer'}
    ]
}

有没有一种方法,以通过排序答案大小集合?

经过一个小小的研究,我看到添加另一个领域的建议,将包含答案的数量和使用它作为一个参考,但可能有做它原生的方式?

mongodb size sql-order-by
3个回答
47
投票

我想你也许可以使用$size,但这只是找到了一定规模的阵列,而不是订购。

从蒙戈文档:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

您不能使用$大小找到各种尺寸(例如:数组有超过1元)。如果您需要查询的范围,创建您在添加元素增加一个额外的大小字段。索引不能被用于查询的$大小的部分,但如果包括其他查询表达式索引可以用于搜索的查询表达式的部分匹配。

看起来你也许可以很容易用新的聚合框架,编辑做到这一点:这是还没有出来。 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
}

33
投票

我使用$项目如下:

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

它允许还包括空答案文件。但也有缺点(或有时优势):你应该手动添加所需的所有领域项目的一步。


3
投票

您可以使用MongoDB的聚合阶段$addFields这将增加额外的字段来存储计数,然后接着$sort阶段。

db.test.aggregate([
    {
        $addFields: { answers_count: {$size: { "$ifNull": [ "$answers", [] ] } } }
    }, 
    {   
        $sort: {"answers_count":1} 
    }
])
© www.soinside.com 2019 - 2024. All rights reserved.