【问题标题】:Aggregate - $push an Array Expression in $group聚合 - 在 $group 中 $push 一个数组表达式
【发布时间】:2018-05-26 10:36:06
【问题描述】:

我有这个聚合管道:

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

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

如果我尝试在$push 下的$project 中将datapoints 的相同表达式放在$group 中,它会给我一个错误

【问题讨论】:

    标签: arrays node.js mongodb aggregation-framework


    【解决方案1】:

    这是一个公平的观点,因为您不能简单地将 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 累加器是一元运算符",

    而且这种表达在语法上是不正确的:

    "datapoint": { "$push": { ["a"] }
    

    因此,您需要某种“一元”而非“基于列表”的“表达式”,并在结果中返回一个 BSON 数组。上述运算符涵盖了这些情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多