如何利用MongoDB中每个单词的首字母大写?

时间:2017-05-03 08:36:28

标签: mongodb mongodb-query aggregation-framework

这应该是一个快速的2分钟发现,但我正在寻找一个小时,但找不到任何解决方案。

  

我如何大写username字段的每个单词的第一个字母

{
    "_id" : ObjectId("5908288bfbce59540a67fa11"),
    "username" : "JOHN DOE"
},
{
    "_id" : ObjectId("5908288bfbce59540a67fa12"),
    "username" : "jane doe"
}

尝试了this solution我并不理解,但它不起作用:Fetched 0 record(s) in 0ms

db.getCollection('test').toupper.aggregate(
    [
        {
            $project: {
                username: {
                    $concat: [{
                        $toUpper: { $substr: ["$username", 0, 1] }
                    }, { $substr: ["$username", 1, 3] }]
                }
            }
        }])

2 个答案:

答案 0 :(得分:3)

要大写字符串中每个单词的第一个字母,首先需要使用 $split 运算符将字符串拆分为给定的分隔符,在这种情况下,分隔符将是空间:

示例

{ "$split": [ "jane doe", " " ] }                                           

<强>结果

[ "jane", "doe" ]

下一步是在上面的结果数组中使用 $map 运算符,对于数组中的每个元素,应用 $toUpper 转换带有 $substrCP 的子字符串以及带有 $concat 的concat过程,以返回已转换的数组。

在转换中,您需要获取给定单词中的第一个字母,将该字母转换为大写,然后连接字符串的其余部分。

对于第一部分,转换如下:

示例

{ "$toUpper": { "$substrCP": ["jane", 0, 1] } }                             

<强>结果

"J"

对于字符串的其余部分

示例

{                                                                           
    "$substrCP": [
        "jane",
        1,
        { "$subtract": [{ "$strLenCP": "jane" }, 1 ]}
    ] 
}               

<强>结果

"ane"

级联

示例

{                                                                           
    $concat: [
        { "$toUpper": { "$substrCP": ["jane", 0, 1] } }, 
        {                                                           
            "$substrCP": [
                "jane",
                1,
                { "$subtract": [{ "$strLenCP": "jane" }, 1 ]}
            ] 
        }
    ]
}

<强>结果

"Jane"

映射到数组中的元素

$map

中使用上述内容

示例

{
    "$map": {
        "input": { "$split": [ "jane doe", " " ] },
        "as": "name",
        "in": {                                                                             
            "$concat": [
                { "$toUpper": { "$substrCP": ["$$name", 0, 1] } }, 
                {                                                           
                    "$substrCP": [
                        "jane",
                        1,
                        { "$subtract": [{ "$strLenCP": "$$name" }, 1 ]}
                    ] 
                }
            ]
        }
    }
}

<强>结果

[ "Jane", "Doe" ]

然后,您可以将上述内容用作 $arrayElemAt 运算符的表达式,并再次使用 $concat

{
    "$addFields": {
        "username": {
            "$concat": [
                { "$arrayElemAt": [map, 0] },
                " ",
                { "$arrayElemAt": [map, 1] }
            ]
        }
    }
}

您的最终聚合操作变为:

var map = {
    "$map": {
        "input": { "$split": [ "$username", " " ] },
        "as": "name",
        "in": {                                                                             
            "$concat": [
                { "$toUpper": { "$substrCP": ["$$name", 0, 1] } }, 
                {                                                           
                    "$substrCP": [
                        "$$name",
                        1,
                        { "$subtract": [{ "$strLenCP": "$$name" }, 1 ]}
                    ] 
                }
            ]
        }
    }
};

db.getCollection('test').aggregate([
    {
        "$addFields": {
            "username": {
                "$concat": [
                    { "$arrayElemAt": [map, 0] },
                    " ",
                    { "$arrayElemAt": [map, 1] }
                ]
            }
        }
    }
]);

NB:尚未对上述内容进行过测试,但至少应该就如何解决问题提供一些指导。

答案 1 :(得分:3)

以下是使用$substrCP$concat作为$map表达式的另一种方法。

当然,您需要$toUpper和他的兄弟犯罪$toLower将字符串转换为大写或小写

db.collection.aggregate([
       {
          "$addFields": {
             "username": {
                "$reduce": {
                   "input": {
                      "$map": {
                         "input": {
                            "$split": [
                               "$username",
                               " "
                            ]
                         },
                         "in": {
                            "$concat": [
                               {
                                  "$toUpper": {
                                     "$substrCP": [
                                        "$$this",
                                        0,
                                        1
                                     ]
                                  }
                               },
                               {
                                  "$toLower": {
                                     "$substrCP": [
                                        "$$this",
                                        1,
                                        { "$strLenCP": "$$this" }
                                     ]
                                  }
                               }
                            ]
                         }
                      }
                   },
                   "initialValue": "",
                   "in": {
                      "$concat": [
                         "$$value",
                         " ",
                         "$$this"
                      ]
                   }
                }
             }
          }
       }
    ]
)