我有一组文件,每个文件都有一个矢量字段:
'vector':[x1, x2, ..., xn]
如何执行所有'vector'
字段的按元素添加?
我的最终目标是获取集合子集的平均'vector'
字段。
我正在使用聚合框架$match
某个子集,然后使用$unwind:vector
来获取此子集。下一步是按文件计数执行逐元素加法和除法,我不知道如何做到这一点。
收集子集:
{
"_id" : 1,
"vector" : [
1,
2,
3
]
}
{
"_id" : 2,
"vector" : [
3,
2,
1
]
}
预期结果:
avgVector:[1+3, 2+2, 3+1]/2 = [2, 2, 2]
答案 0 :(得分:0)
您可以执行此操作,因为n = 3
,其中n
是向量的长度。一般而言,我不相信您可以使用该文档结构对元素进行元素添加。没有办法直接组合向量,但是如果你放松它们,你通常不会有一种组合相似组件的方法。
但是,当向量的长度为3时,我们可以破解它:
db.vectors.aggregate([
// put a $match here if you want to consider a subset
{ "$unwind" : "$vector" },
{ "$group" : {
"_id" : "$_id",
"first" : { "$first" : "$vector" },
"last" : { "$last" : "$vector" },
"v_sum" : { "$sum" : "$vector" }
} },
{ "$group" : {
"_id" : null,
"avg_first" : { "$avg" : "$first" },
"avg_last" : { "$avg" : "$last" },
"v_avg" : { "$avg" : "$v_sum" }
} },
{ "$project" : {
"avg_first" : 1,
"avg_last" : 1,
"avg_middle" : { "$subtract" : [{ "$subtract" : ["$v_avg", "$avg_first"] }, "$avg_last"] }
} }
])
我们可以选出第一个和最后一个组件,因为$unwind
将保留数组的顺序。我们可以对这些进行平均并从所有组件的平均总和中减去平均值,以得到中间组件的平均值。