【问题标题】:Mongodb aggregation $size inside nested array嵌套数组中的MongoDB聚合$size
【发布时间】:2020-01-25 18:40:06
【问题描述】:

我对聚合框架的查询有疑问。 给定一个包含以下文档的集合:

db.testSize.insert([{
    "internalId" :1,
    "first" : {
            "second" : [
                {
                    "value" : 1
                }
            ]
    }

}])

这个聚合:

db.testSize.aggregate([
 { $addFields: { tmpSize: { $strLenCP: { $ifNull: [ { $toString: "$first.second.value" }, "" ] } } } },
])

返回此错误:

{
    "message" : "Unsupported conversion from array to string in $convert with no onError value",
    "ok" : 0,
    "code" : 241,
    "codeName" : "ConversionFailure",
    "name" : "MongoError"
}

现在,解决这个问题的方法是通过以下方式使用 unwind:

db.testSize.aggregate([
 { $unwind: "$first.second"},
 { $addFields: { tmpSize: { $strLenCP: { $ifNull: [ { $toString: "$first.second.value" }, "" ] } } } },
])

但我的要求是为具有各种形状和可能嵌套数组的文档创建一个通用方法。 由于这个错误https://jira.mongodb.org/browse/SERVER-6436 似乎无法在数组中展开数组,那么如何解决这个问题?

有办法吗?

一些上下文:

  • 我无法在聚合之前更改文档结构
  • 我不知道数组在“字段层次结构”中的位置,例如第一个是数组还是第二个

提前致谢

【问题讨论】:

  • 您能详细说明一下吗?在我的情况下,我无法找到使用 $map 的方法,因为我需要的是一种通用方法,正如我所写的那样
  • 检查新答案

标签: mongodb aggregation-framework


【解决方案1】:

您可以使用$reduce

====== 聚合 ======

db.testSize.aggregate([
  {
    "$addFields": {
      "first.second.tmpSize": {
        "$reduce": {
          "input": "$first.second",
          "initialValue": "",
          "in": {
            $strLenCP: {
              $ifNull: [
                {
                  $toString: "$$this.value"
                },
                ""
              ]
            }
          }
        }
      }
    }
  }
])

====== 结果 ======

[
  {
    "_id": ObjectId("5d925bd3fabc692265f950d5"),
    "first": {
      "second": [
        {
          "tmpSize": 1,
          "value": 1
        }
      ]
    },
    "internalId": 1
  }
]

Mongo Playground

【讨论】:

  • 感谢这个解决方法,但是 Mongodb 在这里的不足与使用数组中的嵌套数组处理这个有关,在数组中
猜你喜欢
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 2015-12-06
  • 2017-07-16
  • 1970-01-01
  • 2021-06-27
  • 2021-03-19
  • 1970-01-01
相关资源
最近更新 更多