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

时间:2017-01-25 09:36:01

标签: 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"
        }
    ]
}

谢谢

3 个答案:

答案 0 :(得分:3)

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阶段,您可以将结果写入新集合或替换旧集合。

另一种方法是使用mapReduce trim 空间并使用批量操作更新您的收藏:

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 }}
)

更新部分留作读者练习

答案 1 :(得分:0)

你需要编写一些客户端javascript。在mongo shell中你可以这样做:

RDD

答案 2 :(得分:0)

这是一种通过在MongoDB游标上的文档数组上执行javascript children.status循环来修剪所有forEach字段的方法:

db.COLLECTION_NAME.find({}).forEach(
  function(doc){
    db.COLLECTION_NAME.update({"_id":doc.id}, {"$set":{
      children:doc.children.map(function(child){return Object.assign(
        child,
        {
          status: child.status.trim()        
        }
      )})
    }})
  }
)

当然,您需要更新COLLECTION_NAME和任何其他相关字段。您可能还想添加一些逻辑以确保值是您期望的类型。