2014-02-18 26 views
0

不同的格式,我有一個電話號碼MongoDB中獲取來自現場

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

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

的不同格式的電話號碼字段可以讓所有不同的電話號碼格式MongoDB的幫助?

預期成果是:2

+2

如果你不知道所有可能的格式,我認爲這是不可能的 –

+0

什麼是格式?你必須先回答這個問題。 – heinob

+0

一個定義你的手機格式的正則表達式,例如:'^ \ +?\ d +( - \ d +)* $' –

回答

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模板。

+0

請正確,它是值,不是減號功能中的值 – Steve

+0

@StephenTalari這就是當我只輸入響應而不從代碼複製時發生的情況。哎呀 –

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