mongodb - 修剪记录值/删除空格/制表符

标签 mongodb mapreduce mongodb-query aggregation-framework trim

这是我的 MongoDb 结构的示例:

{
    "id" : 1,
    "children" : [ 
        {
            "id" : 2,
            "status" : "     fsdfsdf           "
        }, 
        {
            "id" : 3,
            "status" : "        ffdfg       "
        }, 
        {
            "id" : 4,
            "status" : "   fsdfsdfsdfdsf          "
        }
    ]
}

我想要更新查询..查询必须修剪(删除空格和/或制表符) 所以我的记录将是:

{
    "id" : 1,
    "children" : [ 
        {
            "id" : 2,
            "theText" : "fsdfsdf"
        }, 
        {
            "id" : 3,
            "status" : "ffdfg"
        }, 
        {
            "id" : 4,
            "status" : "fsdfsdfsdfdsf"
        }
    ]
}

谢谢

最佳答案

MongoDB 不提供字符串运算符来修剪字符串,但我们可以使用聚合框架构建一个字符串运算符,但此解决方案需要 MongoDB 3.4 或更高版本。

db.coll.aggregate([
    { "$addFields": {
        "children": { 
            "$map": { 
                "input": "$children", 
                "as": "child", 
                "in": { 
                    "id": "$$child.id", 
                    "status": {
                        "$arrayElemAt": [
                            { "$filter": { 
                                "input": { "$split": [ "$$child.status", " " ] },
                                "as": "ch", 
                                "cond": { "$gt": [ { "$strLenCP": "$$ch" }, 0 ]}
                            }}, 
                            0
                        ]
                    }
                }
            }
        }
    }},
    { "$out": "coll" }
])

我们的管道中只需要一个阶段,即 $project阶段或 $addFields阶段。我选择使用 $addFields 自动在结果中包含其他字段。

我们需要对“children”数组中的每个元素应用一个表达式,这对于 $map 来说是一个完美的工作。数组运算符。

in表达式中,我们简单地$split我们的子字符串中的字符串,$filter删除所有长度为0的子字符串得到的数组。

要返回字符串的长度,我们使用 $strLenCP运算符。

然后我们使用$arrayElemAt返回唯一剩余的字符串。运算符。

我们管道的最后一个阶段是$out将结果写入新集合或替换旧集合的阶段。


另一种替代方法是使用 mapReducetrim 空间并使用批量操作更新您的集合:

MapReduce 查询:

db.coll.mapReduce(function() { 
    emit(
        this._id, 
        this.children.map( child => { 
            return { "id": child.id, "status": child.status.trim() };
        })
    ); }, function(key, value) {}, {"out": {"inline": 1 }}
)

更新部分留给读者作为练习

关于mongodb - 修剪记录值/删除空格/制表符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41848031/

相关文章:

java - 在 mongodb 中存储日期的有效方法是什么?

mongodb - 根据字段的存在或不存在在投影管道中实现 mongo $cond 字段

database - MongoDB聚合: How to return only the values that don't exist in all documents

MongoDB:数据分区上的磁盘I/O利用率已消失

java - 使用java从sqlserver将大数据导出到CSV

python - 在列表中附加不同的字典值

mongodb - 使用 mongodb 聚合框架按数组长度分组

apache - 批量加载时,Phoenix Hbase rowtimestamp功能不起作用

每天 2 亿次写入的数据库解决方案,每月汇总查询

javascript - 使用 JavaScript 在 MongoDB 中返回 _id 的脚本