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)
要大写字符串中每个单词的第一个字母,您首先需要使用$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)
注意:尚未测试上述内容,但它至少应该为您提供有关如何解决问题的一些指导。
| 归档时间: |
|
| 查看次数: |
4297 次 |
| 最近记录: |