我想从mongo db字段中提取一个子字符串,并检查它是否可以被4整除

时间:2018-09-11 08:58:15

标签: mongodb

我想从mongo db字段中提取一个子字符串,并检查它是否可以被4整除。

我有一些如下文件:

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

我想基于form-1002之类的表单字段提取文档,将1002整除为2,然后根据查询结果更新请求类型。我该如何实现?

1 个答案:

答案 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)