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

在MongoDB中获取具有最大内部数组大小的文档,mongodb,mongodb-query,aggregation-framework,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”:[ { “一”:“2382349385”, “t”:“2014-01-15T23:43:29+0000” }, {

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”:[
{
“一”:“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”:{{u id:null,编号:{$sum:1}})

为了计算内部元素,您需要一些东西来锚定分组。在这种情况下,您可以使用与
y
处于相同级别的
i
元素:

db.collection.aggregate([
{“$unwind”:“$x”},
{“$unwind”:“$x.y”},
{“$group”:{
“_id”:{
“\u id”:“$\u id”,
“xi”:“$x.i”
},
“数字”:{“$sum”:1}
}},
{“$sort”:{“number”:-1},
{“$limit”:1}
])

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

如果您想在集合中找到具有最多“y”的文档在聚合框架中实现这一点的方法如下:

db.coll.aggregate( {$unwind:"$x"},
                   {$project:{ysize:{$size:"$x.y"}}},
                   {$group:{_id:"$_id",numYs:{$sum:"$ysize"}}},
                   {$sort: {numYs:-1} },
                   {$limit: 1 }
)
这将使用该值来投影每个文档中内部y数组的大小,并且该组将它们相加,以计算每个文档中有多少个“y”元素

通过添加排序和限制,您可以保留前一个或前N个

这将按整个文档中y元素的总数进行排序。如果您只想知道哪个文档中的数组y最长,那么就更简单了,只需取出组并在ysize上排序:

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

尝试此聚合查询

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

为什么要在null上分组?由于x本身就是一个数组,$size运算符在升级到2.6时,将不再需要展开y数组,然后将其分组回去计算其大小,因此如何在此基础上找到x的大小。