在MongoDB中获取内部数组最大大小的文档

时间:2014-04-25 21:17:32

标签: mongodb mongodb-query aggregation-framework

示例Mongo文档:

{
    "_id": "128374",
    "x": [
        {
            "i": "83847575",
            "y": [
                {
                    "i": "9389489283",
                    "t": "2014-04-11T20:46:57+0000"
                },
                {
                    "i": "9389489284",
                    "t": "2014-04-11T20:47:57+0000"
                }
            ]
        },
        {
            "i": "83847576",
            "y": [
                {
                    "i": "2382349385",
                    "t": "2014-01-15T23:43:29+0000"
                },
                {
                    "i": "9389489286",
                    "t": "2014-04-11T20:47:57+0000"
                },
                {
                    "i": "9389489286",
                    "t": "2014-04-11T20:49:57+0000"
                }
            ]
        }
    ]
}

如何获得内部阵列的最大数量' y'每份文件?我试图解决的问题是获取最大数量为“y”的记录。谢谢!

以下为我提供了' y'的总数。

db.coll.aggregate( 
{ "$unwind" : "$x" } , 
{ "$project" : { "x" : "$x" } } , 
{ "$unwind" : "$x.y" }, 
{ "$group" : { _id : null, number : { $sum : 1 } } } )

3 个答案:

答案 0 :(得分:2)

如果您想在集合中找到最多" y"其中的元素在聚合框架中的方式是这样的:

db.coll.aggregate( {$unwind:"$x"},
                   {$project:{ysize:{$size:"$x.y"}}},
                   {$group:{_id:"$_id",numYs:{$sum:"$ysize"}}},
                   {$sort: {numYs:-1} },
                   {$limit: 1 }
)

这使用$size operator (new in 2.6)来计算每个文档中内部y数组的大小,然后该组将它们重新添加以计算多少" y"每个文件都有的元素。

添加排序和限制可以让你保持最高的一个或前N个。

这为您提供整个文档中y元素总数的顺序。如果您只想知道哪个文档中包含最长的数组y,它甚至更简单,只需取出组并对ysize进行排序:

db.coll.aggregate( {$unwind:"$x"},
                   {$project:{ysize:{$size:"$x.y"}}},
                   {$sort: {ysize:-1} },
                   {$limit: 1 }
)

答案 1 :(得分:1)

为了计算内部元素,您需要锚定一些内容才能进行分组。在这种情况下,您可以使用与“y”处于同一级别的“i”元素:

db.collection.aggregate([
    { "$unwind" : "$x" }, 
    { "$unwind" : "$x.y" }, 
    { "$group" : { 
        "_id" : {
          "_id": "$_id",  
          "xi":"$x.i"
        },
        "number" : { "$sum" : 1 } 
    }},
    { "$sort": { "number": -1 }},
    { "$limit": 1 } 
])

因此,通过将分组键与文档“_id”混合,您可以将具有最大内部值“y”的文档作为计数进行匹配,方法是将其排序到顶部。

答案 2 :(得分:0)

尝试此聚合查询。

db.collection.aggregate([
    {$unwind: '$x'},
    {$group: {_id: null, maxLengthOfYArray: {$max: {$size: '$x.y'}}}}
])