database - 用golang动态查询mongodb

标签 database mongodb go nosql mgo

我正在尝试使用 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。

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

谢谢

最佳答案

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

result[ ] = "$in"

因为这是一个编译时错误。

但是查询文档的元素(条件)在默认情况下是逻辑与连接,所以这就是它所需要的:

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 package 还接受范围广泛的映射和结构,而不仅仅是 bson.M . Collection.Find() 的文档关于允许的类型有这样的说法:

The document may be a map or a struct value capable of being marshalled with bson. The map may be a generic one using interface{} for its key and/or values, such as bson.M, or it may be a properly typed map. Providing nil as the document is equivalent to providing an empty document such as bson.M{}.

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

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

关于database - 用golang动态查询mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51069544/

相关文章:

c# - mysql 只返回一个值

mongodb - 有没有办法用 MongoDB 替换 Many()?

node.js - "could not authenticate"与 promised-mongo

go - 净/http : TLS handshake timeout when call external https from google cloud

sql - 轻量级数据库(SQL 或 NoSQL)

database - GUID/UUID 数据库键的优缺点

go - Go中的父子上下文取消顺序

go - 将文件存储在可执行二进制文件中

java - Axon 框架 - 对每个聚合根使用单独的 Mongo 域事件集合

python - 如何使用 django 从 mongodb 数据库中检索数据?