首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有数组项的mongoDB $concat字符串

带有数组项的mongoDB $concat字符串
EN

Stack Overflow用户
提问于 2022-09-28 15:43:31
回答 1查看 17关注 0票数 0

这是我的收藏:

代码语言:javascript
复制
[
  {
    "_id": {
      "$oid": "6332dda58121948311cbdb67"
    },
    "date": "2022-09-13",
    "file": "xxx",
    "package": 1,
    "userList": [
      {
        "userName": "user_1",
        "crDate": "2022.09.28",
        "boolId": 1
      }
    ]
  },
  {
    "_id": {
      "$oid": "6332dda58121948311cbdb68"
    },
    "date": "2022-09-13",
    "file": "xxx",
    "package": 2,
    "userList": []
  }
]

我想要的输出是这样的(如果所有的userList数组都是空的):

代码语言:javascript
复制
[
  {
    "_id": "2022-09-13",
    "items": [
      {
        "fileName": "xxx",
        "items": [
          {
            "package": "1 - na" 
          },
          {
            "package": "2 - na" 
          }
        ]
      }
    ]
  }
]

如果我在userList数组中有一个对象的话:

代码语言:javascript
复制
[
  {
    "_id": "2022-09-13",
    "items": [
      {
        "fileName": "xxx",
        "items": [
          {
            "package": "1 - user_1" 
          },
          {
            "package": "2 - na" 
          }
        ]
      }
    ]
  }
]

我试着运行这个集合:

代码语言:javascript
复制
db.collection.aggregate([
  {
    $group: {
      _id: {
        "date": "$date",
        "file": "$file",
        
      },
      "items": {
        $push: {
          "package": {
            $concat: [
              {
                $toString: "package"
              },
              " - ",
              {
                $toString: {
                  $arrayElemAt: [
                    "$userList",
                    0
                  ]
                }
              }
            ]
          }
        }
      }
    }
  },
  {
    $group: {
      _id: "$_id.date",
      "items": {
        $push: {
          "fileName": "$_id.file",
          "items": "$items"
        }
      }
    },
    
  },
  
])

如果userList数组为空,则它正在运行,但它没有返回所需的输出,如果userList数组不是空的,则引发以下错误:

代码语言:javascript
复制
Mongo Server error (MongoCommandException): Command failed with error 241 (ConversionFailure): 'Unsupported conversion from object to string in $convert with no onError value' on server 

下面是一个例子:游乐场

我应该如何修改聚合?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-28 15:59:26

它需要在第一个$group阶段进行两个修复,

  • 错过了$package属性名中的符号,在{ $toString: "$package" }
  • 在访问userName中的第一个元素时使用属性名称$userList.userName
  • 使用$ifNull运算符检查属性是否不存在,然后返回"na“字符串
代码语言:javascript
复制
db.collection.aggregate([
  {
    $group: {
      _id: {
        "date": "$date",
        "file": "$file"
      },
      "items": {
        $push: {
          "package": {
            $concat: [
              { $toString: "$package" }, // <====== here 
              " - ",
              {
                $toString: {
                  $ifNull: [
                    { $arrayElemAt: ["$userList.userName", 0] },  // <====== here 
                    "na"
                  ]
                }
              }
            ]
          }
        }
      }
    }
  },
  {
    $group: {
      _id: "$_id.date",
      "items": {
        $push: {
          "fileName": "$_id.file",
          "items": "$items"
        }
      }
    }
  }
])

游乐场

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73884301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档