【问题标题】:Concat array field inside an array of object into one string field in mongodb aggregate将对象数组中的数组字段连接到mongodb聚合中的一个字符串字段中
【发布时间】:2020-07-24 06:50:36
【问题描述】:

我想将一组对象中的数组字段值连接到一个字符串字段中。 这是现有的文档格式:

{ 
  "no" : "123456789",  
  "date" : ISODate("2020-04-01T05:19:02.263+0000"), 
  "notes" : [
    {
        "_id" : ObjectId("5b55aabe0550de0021097bf0"),  
        "term" : "BLA BLA"
    }, 
    {
        "_id" : ObjectId("5b55aabe0550de0021097bf1"), 
        "term" : "BLA BLA BLA"
    }, 
    {
        "_id" : ObjectId("5b55aabf0550de0021097ed2"), 
        "term" : "BLA"
     }
  ], 
   "client" : "John Doe"
}

所需文件格式:

{ 
  "no" : "123456789",  
  "date" : ISODate("2020-04-01T05:19:02.263+0000"),  
  "notes" : "BLA BLA \n BLA BLA BLA \n BLA",
  "client" : "John Doe"
}

$project 的尝试:

 { "$project": {    
      "notes": { 
            "$map": { 
                "input": "$notes", 
                "as": "u", 
                  "in": { 
                      "name": { "$concat" : [ "$$u.term", "\\n" ] } 
                  } 
             }
         }
     }
 }

但这会返回这个:

{ 
  "no" : "123456789",  
  "date" : ISODate("2020-04-01T05:19:02.263+0000"),  
  "client" : "John Doe"
  "notes" : [
    {
        "name" : "BLA \n"
    }, 
    {
        "name" : "BLA BLA \n"
    }, 
    {
        "name" : "BLA BLA BLA \n"
    }
  ]
}

如何将其转换为所需的格式?任何想法将不胜感激!

编辑:

如果我们尝试将数组字段值添加在一起,我们如何在不分组的情况下这样做呢?

现有格式:

{
   "sale" : { 
       "bills" : [
        {
            "billNo" : "1234567890", 
            "billAmt" : NumberInt(1070), 
            "tax" : NumberInt(70) 
          }
       ]
    }, 
  "no" : "123456789",  
  "date" : ISODate("2020-04-01T05:19:02.263+0000")

}

必填:

{
 "no" : "123456789",  
 "date" : ISODate("2020-04-01T05:19:02.263+0000"),
 "total" : NumberInt(1140)
}

【问题讨论】:

    标签: mongodb aggregation-framework project aggregation


    【解决方案1】:

    您可以使用$reduce 将字符串数组转换为单个字符串:

    db.collection.aggregate([
        {
            $addFields: {
                notes: {
                    $reduce: {
                        input: "$notes.term",
                        initialValue: "",
                        in: {
                            $cond: [ { "$eq": [ "$$value", "" ] }, "$$this", { $concat: [ "$$value", "\n", "$$this" ] } ]
                        }
                    }
                }
            }
        }
    ])
    

    Mongo Playground

    【讨论】:

    • 用新的 scnario 更新了问题,请检查
    • @dineshalwis 请打开一个新的,而不是编辑现有的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2020-11-25
    • 2020-11-27
    • 1970-01-01
    • 2019-05-10
    • 2012-09-30
    相关资源
    最近更新 更多