使用Golang动态查询mongodb

时间:2018-06-27 18:45:31

标签: database mongodb go nosql mgo

我正在尝试仅使用一个函数使用golang(和mgo库)查询我的mongodb数据库,而我当前使用的方法是:

er = c.Find(sel(items)).Sort("-createdAt").All(&result)

item是地图,键是我正在db中搜索的字段的名称,值是我要搜索的内容。

和sel()是:

func sel(query map[string]string) bson.M {
result := make(bson.M, len(query))
result[ ] = "$in"
for k, v := range query {
    result[k] = v
}
return result

当前,它将返回所有至少有一个字段与输入映射匹配的结果。 (因此为逻辑或),但是我希望它返回这些字段的逻辑与。

有人对如何修改现有代码或有效查询数据库的新方法有建议吗?

谢谢

1 个答案:

答案 0 :(得分:3)

我不知道这行是什么意思:

result[ ] = "$in"

因为它是编译时错误。

但是查询文档的元素(条件)默认情况下处于逻辑AND连接,所以这就是全部操作:

func sel(query map[string]string) bson.M {
    result := make(bson.M, len(query))
    for k, v := range query {
        result[k] = v
    }
    return result
}

如果这给您提供了集合中的所有文档,则意味着所有键值对都匹配所有文档。使用简单的过滤器进行试验,看看它是否有效。

还请注意,mgo包还接受各种映射和结构,而不仅仅是bson.M Collection.Find()的文档中有这样的说法:允许的类型:

  

文档可以是能够与bson一起编组的映射或结构值。该映射可能是使用interface {}作为其键和/或值的通用映射,例如bson.M,也可能是正确键入的映射。提供nil作为文档等同于提供一个空文档,例如bson.M {}。

因此,您可以使用map[string]string类型的地图,而无需对其进行转换:

err = c.Find(items).Sort("-createdAt").All(&result)