database - 使用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。
有没有人有关于如何修改现有代码或有效查询数据库的新方法的建议?
谢谢
解决方案
我不知道这条线应该是什么意思:
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)
推荐阅读
- deep-learning - 标记所有可见对象以进行对象检测是否重要?
- teradata - Teradata 存储过程
- jmeter - 如何在 loadrunner 中传递随机特定值..?
- c# - 如何从命令行使用 PHP 中的会话?
- nativescript - Objective-C 在 Nativescript 中编组“可选”属性的问题
- python - PI 小数点后第 n 位
- java - 如何执行存储在 Java 上的 String 变量中的多个请求?
- excel - VBA - 日期时间字符串替换/替换
- sql - 如何在postgresql的查询中一起转换列和函数之间的使用
- r - 总结选定的行重复项