【问题标题】:MongoDB Aggregation using $add failed when using within $group. (Error: $add only supports numeric or date types, not string)在 $group 内使用时,使用 $add 的 MongoDB 聚合失败。 (错误:$add 只支持数字或日期类型,不支持字符串)
【发布时间】:2021-04-14 14:39:46
【问题描述】:

我正在关注 MongoDB 大学的聚合管道课程。

这是“电影”集合的格式。

{
    "_id" : ObjectId("573a1390f29313caabcd4cf1"),
    "title" : "Ingeborg Holm",
    "cast" : [
        "Aron Lindgren",
        "Erik Lindholm",
    ],
    "imdb" : {
        "rating" : 7,
    },
}

这是我的聚合:

db.movies.aggregate( [
  { $unwind: { path: "$cast" } },
  { $set: { "average": 0 } },
  { $group: { 
    _id: "$cast",
    numFilms: { $sum: 1 },
    average: { $avg: { $add: ["$average", "$imdb.rating"] } }, //failed here
  }}
] )

我想做的事:

根据每个演员的每部电影计算平均评分 (imdb.rating)。

目前发生的情况:

发生错误

$add: ["$average", "$rating"]

出现以下消息错误:

"errmsg" : "$add 只支持数字或日期类型,不支持字符串",

问题:

有人能解释为什么 $rating 被认为是一个字符串吗?

我在上面提供了一个如何格式化“电影”集合的示例。 似乎 $add 仅在 $group 中调用时才以“$imdb.rating”失败 (并且在使用“$imdb.rating”时在 $group 之外正常工作)

还有其他计算平均值的方法吗?

【问题讨论】:

  • 你有imdb.rating: ""的记录吗?
  • 确实有一种情况,imdb.rating 等于 ""
  • 完美,您可以删除"" 值或将它们设置为0。或者您可以使用答案中提到的$convert

标签: mongodb aggregation


【解决方案1】:

使用$toInt

 $add: [ { "$toInt": "$imdb.rating" } ]

更好地使用$convert 处理错误和空情况。

演示 - https://mongoplayground.net/p/gOo52xlDBLM

$avg: {
  $add: [
    $average,
    {
      $convert: {
        input: "$imdb.rating",
        to: "int",
        onError: 0,
        onNull: 0
      }
    }
  ]
},

【讨论】:

    猜你喜欢
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2018-06-08
    相关资源
    最近更新 更多