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

Cri*_*alu 8 mongodb mongodb-query aggregation-framework

这应该是一个 2 分钟的快速查找,但我正在搜索一个小时并且找不到任何解决方案。

如何将字段中每个单词首字母大写username

{
    "_id" : ObjectId("5908288bfbce59540a67fa11"),
    "username" : "JOHN DOE"
},
{
    "_id" : ObjectId("5908288bfbce59540a67fa12"),
    "username" : "jane doe"
}
Run Code Online (Sandbox Code Playgroud)

尝试了这个我不太理解的解决方案,但它不起作用:Fetched 0 record(s) in 0ms

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

chr*_*dam 9

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

例子

{ "$split": [ "jane doe", " " ] }                                           
Run Code Online (Sandbox Code Playgroud)

结果

[ "jane", "doe" ]
Run Code Online (Sandbox Code Playgroud)

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

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

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

例子

{ "$toUpper": { "$substrCP": ["jane", 0, 1] } }                             
Run Code Online (Sandbox Code Playgroud)

结果

"J"
Run Code Online (Sandbox Code Playgroud)

而对于字符串的其余部分

例子

{                                                                           
    "$substrCP": [
        "jane",
        1,
        { "$subtract": [{ "$strLenCP": "jane" }, 1 ]}
    ] 
}               
Run Code Online (Sandbox Code Playgroud)

结果

"ane"
Run Code Online (Sandbox Code Playgroud)

级联

例子

{                                                                           
    $concat: [
        { "$toUpper": { "$substrCP": ["jane", 0, 1] } }, 
        {                                                           
            "$substrCP": [
                "jane",
                1,
                { "$subtract": [{ "$strLenCP": "jane" }, 1 ]}
            ] 
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

结果

"Jane"
Run Code Online (Sandbox Code Playgroud)

映射到数组中的元素

使用以上内容$map

例子

{
    "$map": {
        "input": { "$split": [ "jane doe", " " ] },
        "as": "name",
        "in": {                                                                             
            "$concat": [
                { "$toUpper": { "$substrCP": ["$$name", 0, 1] } }, 
                {                                                           
                    "$substrCP": [
                        "jane",
                        1,
                        { "$subtract": [{ "$strLenCP": "$$name" }, 1 ]}
                    ] 
                }
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果

[ "Jane", "Doe" ]
Run Code Online (Sandbox Code Playgroud)

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

{
    "$addFields": {
        "username": {
            "$concat": [
                { "$arrayElemAt": [map, 0] },
                " ",
                { "$arrayElemAt": [map, 1] }
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您的最终聚合操作变为:

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] }
                ]
            }
        }
    }
]);
Run Code Online (Sandbox Code Playgroud)

注意:尚未测试上述内容,但它至少应该为您提供有关如何解决问题的一些指导。