首页 > 解决方案 > 使用golang动态查询mongodb

问题描述

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

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

其中 items 是地图,键是我在数据库中搜索的字段的名称,值是我要搜索的内容。

和 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

目前它将返回至少一个字段与输入映射匹配的所有结果。(所以是逻辑 OR)但是我希望它返回这些字段的逻辑 AND。

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

谢谢

标签: databasemongodbgonosqlmgo

解决方案


我不知道这条线应该是什么意思:

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)

推荐阅读