如何根据输入创建bson地图

how to create bson map based on input

我正在使用 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,
    }

我如何将两者结合起来(从函数构建 bson.M 和 return,value1/2 是此函数的参数)以基于 if 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),那么当 value_1 为空字符串时,我的 mongo 聚合查询将不起作用,因为它会将 id_1 视为“ ",而我打算在我的 bson 对象中只包含 id_2。

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

这个怎么样:

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