MongoDB从字段中获取不同的格式

时间:2014-02-18 07:51:54

标签: regex mongodb mapreduce

我有一个电话号码字段,其中包含不同格式的电话号码

 +90 224-XXXXXXX
 +90 223-XXXXXXX
 +90 228-XXXXXXX

 (0221) XXX XXXX
 (0224) XXX XXXX
 (0222) XXX XXXX

mongodb可以帮助获取所有不同的手机格式吗?

预期输出为:2

2 个答案:

答案 0 :(得分:1)

你可以使用mapReduce来做这件事,虽然这是一个很棒的mapReduce方式:

db.collection.mapReduce(

    // Mapper - replace all digits with "X"
    function() { 
        emit( "pattern", this.number.replace(new RegExp("[0-9]","g"), "X") ) 
    },

    // Reducer
    function(key, values) {
        var result = { items: [] };

        values.forEach( function(value) {
            // Only add *not found* items to result
            if ( result.items.indexOf( value ) == -1 ) {
                result.items.push( value );
            }
        });

        return result;
    },

    // Output
    {  out: { inline: 1 } }
);

这会产生类似的结果:

{
    "results" : [
            {
                    "_id" : "pattern",
                    "value" : {
                            "items" : [
                                    "+XX XXX-XXXXXXX",
                                    "(XXXX) XXX XXXX"
                            ]
                    }
            }
    ],
    "timeMillis" : 4,
    "counts" : {
            "input" : 3,
            "emit" : 3,
            "reduce" : 1,
            "output" : 1
    },
    "ok" : 1,
}

我猜这只是为了检查。但是,如果您想要进行更新或我认为有用的其他内容,您可以使用返回的items部分来构建regex模板。

答案 1 :(得分:0)

保持简单,这段代码有效。

db.collection.mapReduce(

// Mapper
function() {     
    emit( this.phone_number.replace(new RegExp("[0-9]","g"), "X"),1 )     
},

// Reducer
function(key, value) {
    return Array.sum(value);
},

// Output
{  
    out: "tmp_collection"
}
);