如何根据输入创建bson地图

时间:2015-12-02 00:32:19

标签: go bson mgo

我正在使用mgo库在golang中构建一个bson地图。我想重构一些代码,以避免重复。

考虑一下:

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

和另一个类型的bson地图:

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

如果将value_1为空字符串或value_2为空字符串,我如何将两者(从函数构建bson.M并返回,value1 / 2是params到此func)组合使用。

例如:如果我构建了以下函数。我的目的是通过调用buildBsonObject(" 123","")来构建第一种类型的map(见上文),并通过调用buildBsonObject来构建第二种类型("&#34) ;," 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),那么当value_1为空字符串时,我的mongo聚合查询将无效,因为它将视为id_1为"",而我打算只有我的bson对象中的id_2。

有关如何执行此操作的任何建议。感谢。

1 个答案:

答案 0 :(得分: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