2015-12-02 24 views
0

我正在使用mgo庫在golang中構建bson地圖。我想重構一些代碼以避免重複。如何根據輸入創建bson地圖

考慮一下:

bson.M { 
     "$match" : bson.M{ 
      "xyz" : "abc", 
      }, 
      "$id_1" : value_1, 
    } 

和類型的其他BSON地圖:

bson.M { 
     "$match" : bson.M{ 
      "xyz" : "abc", 
      }, 
      "$id_2" : value_2, 
    } 

我怎樣才能將二者結合起來(從功能和回報建立bson.M,值1/2 PARAMS to this func)根據value_1是否爲空字符串或value_2爲空字符串使用。

例如:如果我建立以下功能。我的目的是通過調用buildBsonObject(「123」,「」)來構建第一種類型的地圖(參見上文),並通過調用buildBsonObject(「」,「456」)來構建第二種地圖。

func buildBsonObject (value_1 string, value_2 string) {  
    return bson.M { 
      "$match" : bson.M{ 
       "xyz" : "abc", 
       }, 
       "$id_1" : value_1, 
       "$id_2" : value_2, 
     } 
} 

如果我做了以下(見功能buildBsonObject),那麼當值_1空字符串,我蒙戈聚集查詢將行不通,因爲它會當作ID_1是「」,而我打算只已在ID_2我的bson對象。

關於如何做到這一點的任何建議。謝謝。

回答

0

如何:

func buildBsonObject(value_1 string, value_2 string) bson.M { 
    m := bson.M{ 
    "$match": bson.M{ 
     "xyz": "abc", 
    }, 
    } 
    if value_1 != "" { 
    m["$id_1"] = value_1 
    } 
    if value_2 != "" { 
    m["$id_2"] = value_2 
    } 
    return m 
} 

playground example

另一種方法是密鑰名傳遞給函數:

func buildBsonObject(k string, v string) bson.M { 
    return bson.M{ 
    "$match": bson.M{ 
     "xyz": "abc", 
    }, 
    k: v, 
    } 
} 

playground example

+0

感謝您的答案,這是我也認爲應該工作,但我有一個錯誤(在我發佈之前它在這裏),其實我有多層次的BBS地圖,我犯了一個錯誤,我認爲它不會像那樣工作:( –