mongodb聚合管道,折叠“$project”中的数组属性
给定一组文档,每个文档都有一个数组属性mongodb聚合管道,折叠“$project”中的数组属性,mongodb,mapreduce,mongodb-query,aggregation-framework,Mongodb,Mapreduce,Mongodb Query,Aggregation Framework,给定一组文档,每个文档都有一个数组属性ks: { _id:ObjectId(“…”), ks:[4,3,2,1,3], v:45 }, { _id:ObjectId(“…”), ks:[3,3,5], v:21 }, { _id:ObjectId(“…”), ks:[1,5,2,8,9,7], v:12 } 如何使用key=min ks或其他折叠功能将此集合聚合到列表中 [ { _id:1, v:28.5/=平均值[45,12] }, { _id:3, v:21/=平均值[21] } ] 使
ks
:
{
_id:ObjectId(“…”),
ks:[4,3,2,1,3],
v:45
},
{
_id:ObjectId(“…”),
ks:[3,3,5],
v:21
},
{
_id:ObjectId(“…”),
ks:[1,5,2,8,9,7],
v:12
}
如何使用key=min ks
或其他折叠功能将此集合聚合到列表中
[
{
_id:1,
v:28.5/=平均值[45,12]
},
{
_id:3,
v:21/=平均值[21]
}
]
使用键进行分组
有效
keyf:function(d){d.ks.reduce(function(acc,a){return acc似乎您希望聚合键的最小值为ks
,每个minks
的最小值为“v”。您需要先“ks”
您还需要两次输入数据,一次用于查找ks
的min
,下一次用于计算v
的avg
db.collection.aggregate([
//展开阵列
{“$unwind”:“$ks”},
//查找每个文档的最小密钥
{“$组”:{
“\u id”:“$\u id”,
“ks”:{“$min”:“$ks”},
“v”:{“$first”:“$v”}
}},
//以平均值分组
{“$组”:{
“_id”:“$ks”,
“v”:{“$avg”:“$v”}
}},
//组不对结果进行排序
{“$sort”:{“\u id”:1}
])
结果:
[
{
“_id”:1,
“v”:28.5
},
{
“_id”:3,
“v”:21
}
]
keyf: function(d) { d.ks.reduce(function(acc, a) { return acc<a ? acc : a; }) }