聚合 - $推送$ group

时间:2018-05-25 22:22:52

标签: arrays node.js mongodb aggregation-framework

我有这个聚合管道:

{
    $project: {
        type: '$_id.type',
            datapoints: [
            {$multiply: ['$_id.timestamp', 1000]},
            '$count',
        ],
    },
},
{
    $group: {
        _id: {
            type: '$type',
        },
        datapoints: {$push: '$datapoints'},
    },
},

......这让我想到了以下问题:
我怎么可能在datapoints中向$group添加/推送/添加/等数组(什么可以让我避免$project阶段)?

如果我尝试在datapoints $project下的$push中为$group添加相同的表达式,则会给我一个错误

1 个答案:

答案 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数组。以上运营商涵盖了这些案例。