Использование MongoDB 4.0 и новее:
Построить агрегированный конвейер, который использует $substrCP
для возврата подстрокиполе формы с числовой частью.
Как только вы получите подстроку, преобразуйте ее в числовое значение, используя $toInt
или $convert
.
Используйте оператор $mod
, чтобы получить остаток при делении результата предыдущей операции на 2.
Ниже приведен примерэто показывает полный конвейер с различными полями, которые показывают, как работает каждый из вышеперечисленных операторов:
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)