我想从mongo db
字段中提取一个子字符串,并检查它是否可以被4整除。
我有一些如下文件:
{
"form" : "form-1002",
"requestType" : "POST"
},
{
"form" : "form-1003",
"requestType" : "POST"
}
我想基于form-1002
之类的表单字段提取文档,将1002整除为2,然后根据查询结果更新请求类型。我该如何实现?
答案 0 :(得分:0)
使用MongoDB 4.0及更高版本:
构造一个聚合管道,该管道使用 $substrCP
返回带有数字部分的form字段的子字符串。
获得子字符串后,请使用 $toInt
或 $convert
将其转换为数值。
在将上一个操作的结果除以2时,使用 $mod
运算符获得余数。
下面是一个示例,显示了带有不同字段的完整管道,这些字段显示了上述每个操作符的操作方式:
const pipeline = [
{ "$addFields": {
"formValue": {
"$toInt": {
"$substrCP": [
"$form",
5,
99999999
]
}
},
"remainder": {
"$mod": [
{
"$toInt": {
"$substrCP": [
"$form",
5,
99999999
]
}
},
2
]
},
"computedRequestType": {
"$cond": [
{
"$eq": [
{
"$mod": [
{
"$toInt": {
"$substrCP": [
"$form",
5,
99999999
]
}
},
2
]
},
0
]
},
"POST",
"GET"
]
}
} }
]
db.collection.aggregate(pipeline)
对于这两个文档,上述结果如下:
/* 1 */
{
"_id" : ObjectId("5b979ad11f21b55f5a1399c6"),
"form" : "form-1002",
"requestType" : "POST",
"formValue" : 1002,
"remainder" : 0,
"computedRequestType" : "POST"
}
/* 2 */
{
"_id" : ObjectId("5b979ad11f21b55f5a1399c7"),
"form" : "form-1003",
"requestType" : "POST",
"formValue" : 1003,
"remainder" : 1,
"computedRequestType" : "GET"
}
要更新集合,您可能需要添加另一个管道,该管道在同一集合上使用 $out
运算符,但是管道如下:
const pipeline = [
{ "$addFields": {
"requestType": {
"$cond": [
{ "$eq": [
{ "$mod": [
{ "$toInt": {
"$substrCP": [
"$form",
5,
99999999
]
} },
2
] },
0
] },
"POST",
"GET"
]
}
} },
{ "$out": "collection" }
]
db.collection.aggregate(pipeline)