【问题标题】:mongodb $slice aggregate operator issue when third argument is 0 { $slice: [ <array>, <position>, <n> ] }当第三个参数为 0 { $slice: [ <array>, <position>, <n> ] } 时,mongodb $slice 聚合运算符问题
【发布时间】:2020-12-06 00:27:45
【问题描述】:

考虑下面的 Mongodb 查询。

  db.groups.aggregate([{
        $match: {
        _id: {
            $in: [220]
        },
        active: true
        }
    },
    {
        $project: {
        myArr: {
            $slice: ["$arr", -1, 0]
        },
        name: 1
        
        }
    }]).pretty()

当我执行这个查询时遇到错误:

2020-12-05T19:16:43.002-0500 E  QUERY    [js] uncaught exception: Error: command failed: {
    "operationTime" : Timestamp(1607213793, 1),
    "ok" : 0,
    "errmsg" : "Third argument to $slice must be positive: 0",
    "code" : 28729,
    "codeName" : "Location28729",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1607213793, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
} : aggregate failed :

根据 $slice 文档,https://docs.mongodb.com/manual/reference/operator/aggregation/slice/ 如果指定了第二个参数“位置”,则 $slice 聚合运算符的第三个参数 (“n”) 不能为负数。我将第三个参数值计算为 0,这意味着,我期望 0 个数组元素作为结果。但是,我遇到 errmsg" : "$slice 的第三个参数必须是正数:0"。

如果我的理解不正确,请提出建议,因为查询没有按我的预期执行。

【问题讨论】:

  • 如果你想要一个空数组,为什么要使用$slice
  • 0 不是硬编码值,我计算为 0 ,为简单起见,我硬编码为 0。我使用一些逻辑来计算要从数组中提取的数字元素。

标签: mongodb aggregation-framework


【解决方案1】:

如需使用计算值,可使用$cond

{
  $project:{
    "arrayName":{
        $cond:[{$eq:["$calculatedField",0]}, [], $sliceOperationGoesHere]
     }
  }
}

【讨论】:

【解决方案2】:

0 在指定position 时不是有效的切片值,因为它不是正数。当您计算要在 $slice 中返回的元素数时,如果是 0,您可以改为投影一个空数组,如下所示:

{
  $project: {
    myArr: [],
    name: 1
  }
}

如果它大于 0,您可以将 $slice 运算符传递给 $project 阶段,就像您当前所做的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-25
    • 2018-03-27
    • 2022-12-12
    • 2018-12-05
    • 2015-08-12
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多