这应该是一个快速的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] }]
}
}
}])
答案 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"
]
}
}
}
}
}
]
)