arrays - 聚合 - $push $group 中的数组表达式

标签 arrays node.js mongodb aggregation-framework

我有这个聚合管道:

{
    $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/

相关文章:

javascript - 类型错误 : Cannot read property 'first' of undefined

php - sudo pecl 安装mongodb 问题|未知类型名称 'pcre_cache_entry'

java - 排序数组 - 递归调用

ios - 如何获取所有字典键('LazyMapCollection<..>'错误)

mysql - 如何从 mysql 数据库中存储的数量中减去一个数字

node.js - Couchbase:无法对关闭的存储桶执行操作

node.js - 需要有关 Node.js 多语言演示的指导

javascript - 从 nodejs 到 mongodb 或 mongoose 的动态数据库连接

arrays - 如何在 Perl 中将一个数组分成两个不同的数组

c - sizeof 在这种情况下如何工作?