Arrays Mongo按两列分组,并从另一列返回值数组

Arrays Mongo按两列分组,并从另一列返回值数组,arrays,mongodb,Arrays,Mongodb,我想查询一个mongoDB。我了解如何在sql中实现这一点,但不确定如何在MongoDB中实现 select distinct value, type, array_agg(distribution) as distributions from t group by value, param_type; 我正在尝试此操作,但不断出现错误: db.getCollection('test').aggregate([ { $group: { _id: { &

我想查询一个mongoDB。我了解如何在sql中实现这一点,但不确定如何在MongoDB中实现

select distinct value, type,  array_agg(distribution) as distributions
from t
group by value, param_type;
我正在尝试此操作,但不断出现错误:

db.getCollection('test').aggregate([
  {
    $group: {
      _id: {
        "type": "$type",
        "value": "$value"
      },
      allowDiskUse: true ,
      distribution: {
        $addToSet: "$distribution"
      }
    }
  }]
)



Failed to execute script.

Error: command failed: {
    "ok" : 0,
    "errmsg" : "The field 'allowDiskUse' must be an accumulator object",
    "code" : 40234,
    "codeName" : "Location40234"
} : aggregate failed :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
doassert@src/mongo/shell/assert.js:18:14
_assertCommandWorked@src/mongo/shell/assert.js:583:17
assert.commandWorked@src/mongo/shell/assert.js:673:16
DB.prototype._runAggregate@src/mongo/shell/db.js:266:5
DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1012:12
DBCollection.prototype.aggregate@:1:355
@(shell):1:1

aggregate
将管道作为第一个参数,它基本上是一个对象数组。所以我会尝试这样做:

db.getCollection('test').aggregate([
  {
    $group: {
      _id: {
        "type": "$type",
        "value": "$value"
      },
      distribution: {
        $addToSet: "$distribution"
      }
    }
  }
], { allowDiskUse: true })

请注意
([…])
。另请注意,@turivishal所建议的
{allowDiskUse:true}
aggregate
将管道作为第一个参数,它基本上是一个对象数组。所以我会尝试这样做:

db.getCollection('test').aggregate([
  {
    $group: {
      _id: {
        "type": "$type",
        "value": "$value"
      },
      distribution: {
        $addToSet: "$distribution"
      }
    }
  }
], { allowDiskUse: true })
请注意
([…])
。另请注意,@turivishal建议的
{allowDiskUse:true}
几乎没有修复


  • 管道级应位于阵列括号中
  • aggregate()
    函数的第二个参数中传递
    allowDiskUse:true
    ,启用对临时文件的写入。设置为true时,聚合阶段可以将数据写入
    dbPath
    目录中的
    \u tmp
    子目录
有一些内存限制

结果大小限制:
返回游标或将结果存储在集合中时,结果集中的每个文档都受BSON文档大小限制的约束,当前为16 MB;如果任何单个文档超过BSON文档大小限制,该命令将产生错误。该限额仅适用于退回的文件;在管道处理过程中,文档可能会超过此大小

内存限制:
管道级的RAM限制为100 MB。如果阶段超过此限制,MongoDB将产生错误。要允许处理大型数据集,请使用
allowDiskUse
选项启用聚合管道阶段以将数据写入临时文件

几乎没有解决办法


  • 管道级应位于阵列括号中
  • aggregate()
    函数的第二个参数中传递
    allowDiskUse:true
    ,启用对临时文件的写入。设置为true时,聚合阶段可以将数据写入
    dbPath
    目录中的
    \u tmp
    子目录
有一些内存限制

结果大小限制:
返回游标或将结果存储在集合中时,结果集中的每个文档都受BSON文档大小限制的约束,当前为16 MB;如果任何单个文档超过BSON文档大小限制,该命令将产生错误。该限额仅适用于退回的文件;在管道处理过程中,文档可能会超过此大小

内存限制:
管道级的RAM限制为100 MB。如果阶段超过此限制,MongoDB将产生错误。要允许处理大型数据集,请使用
allowDiskUse
选项启用聚合管道阶段以将数据写入临时文件


它必须是
“$type”
,而不是
$type
,这同样适用于
“$value”
。谢谢。还是有错误。我将修改这个问题。管道阶段应该在数组括号中
。aggregate([{$group:{…}])
。在aggregate的第二个位置传递参数
{allowDiskUse:true}
。aggregate([{$group:{…}]),{allowDiskUse:true},请查看我的上一条评论,以了解将
allowDiskUse
参数放在何处的正确语法。它必须是
“$type”
,而不是
$type
,这同样适用于
“$value”
。谢谢。还是有错误。我将修改这个问题。管道阶段应该在数组括号中
。aggregate([{$group:{…}])
。在aggregate的第二个位置传递参数
{allowDiskUse:true}
。aggregate([{$group:{…}]),{allowDiskUse:true},请查看我的上一条评论,以了解将
allowDiskUse
参数放在何处的正确语法。该参数运行,但不返回任何结果。@Sql\u Pete\u Belfast它是抛出错误还是只是一个空结果?它给出了一个错误。我只是没看到它出现在另一个屏幕上。我正在修改文件question@Sql_Pete_Belfast有关正确的语法,请参阅更新后的答案。它会运行,但不会返回任何结果。@Sql\u Pete\u Belfast它是在抛出错误还是只是一个空结果?它给出了一个错误。我只是没看到它出现在另一个屏幕上。我正在修改文件question@Sql_Pete_Belfast有关正确的语法,请参阅更新的答案。