我有这个聚合管道:
{
$project: {
type: '$_id.type',
datapoints: [
{$multiply: ['$_id.timestamp', 1000]},
'$count',
],
},
},
{
$group: {
_id: {
type: '$type',
},
datapoints: {$push: '$datapoints'},
},
},
......这让我想到了以下问题:
我怎么可能在datapoints
中向$group
添加/推送/添加/等数组(什么可以让我避免$project
阶段)?
如果我尝试在datapoints
$project
下的$push
中为$group
添加相同的表达式,则会给我一个错误
答案 0 :(得分:2)
这是一个公平的观点,因为你不能简单地用MongoDB 3.2中的“[]
符号表示$push
。
这有点像黑客攻击,但您基本上可以使用$map
包裹表达式,而不是使用[]
表示法:
{ "$group": {
"_id": "$_id.type",
"datapoints": {
"$push": {
"$map": {
"input": [1],
"in": [
{ "$multiply": ["$_id.timestamp", 1000] },
"$count"
]
}
}
}
}}
如果你的MongoDB支持它,甚至是$concatArrays
:
{ "$group": {
"_id": "$_id.type",
"datapoints": {
"$push": {
"$concatArrrays": [
[
{ "$multiply": ["$_id.timestamp", 1000] },
"$count"
]
]
}
}
}}
甚至$setUnion
,实际上可能是最短的类型,但如果对您来说很重要,它可能不会保留元素的顺序:
{ "$group": {
"_id": "$_id.type",
"datapoints": {
"$push": {
"$setUnion": [
[
{ "$multiply": ["$_id.timestamp", 1000] },
"$count"
]
]
}
}
}}
尝试简单地做:
"datapoint": { "$push": [{ "$mulitply": [ ...
当然会导致错误
“errmsg”:“$ push accumulator是一元运算符”,
这种表达在语法上是不正确的:
"datapoint": { "$push": { ["a"] }
所以你需要一种“一元”而不是“基于列表”的“表达式”并在结果中返回一个BSON数组。以上运营商涵盖了这些案例。