Я хочу извлечь подстроку из поля mongo db и проверить, делится ли она на 4 - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу извлечь подстроку из поля mongo db и проверить, делится ли она на 4.

У меня есть документ, подобный приведенному ниже:

{ 
   "form" : "form-1002",
   "requestType" : "POST"
},
{ 
   "form" : "form-1003",
   "requestType" : "POST"
}

Я хочу извлечь документы на основе поля формы, например form-1002, 1002 делится на 2., а затем обновить тип запроса на основе результатов запроса. Как мне этого добиться?

1 Ответ

0 голосов
/ 11 сентября 2018

Использование 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...