我有这个聚合管道:
{
$project: {
type: '$_id.type',
datapoints: [
{$multiply: ['$_id.timestamp', 1000]},
'$count',
],
},
},
{
$group: {
_id: {
type: '$type',
},
datapoints: {$push: '$datapoints'},
},
},
...这让我想到了以下问题:
我怎样才能将数组附加/推送/添加/等到$group
中的datapoints
(什么可以让我避免$project
阶段)) ?
如果我尝试在 $group
的 $push
下的 $project
中添加相同的 datapoints
表达式> 它给了我一个错误
最佳答案
这是一个公平的观点,因为您不能简单地使用 MongoDB 3.2 中可用的“括号”[]
符号来表示 $push
.
这有点像黑客,但你基本上可以用 $map
包装表达式而不是使用 []
表示法:
{ "$group": {
"_id": "$_id.type",
"datapoints": {
"$push": {
"$map": {
"input": [1],
"in": [
{ "$multiply": ["$_id.timestamp", 1000] },
"$count"
]
}
}
}
}}
甚至$concatArrays
如果您的 MongoDB 支持:
{ "$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" : "The $push accumulator is a unary operator",
这种表达式在语法上是不正确的:
"datapoint": { "$push": { ["a"] }
因此,您需要某种“一元”而不是“基于列表”的“表达式”,并在结果中返回 BSON 数组。上述运算符涵盖了这些情况。
关于arrays - 聚合 - $push $group 中的数组表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50537549/