在MongoDB中获取具有最大内部数组大小的文档
Mongo文档示例:在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” }, {
{
“_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的大小。