我正在尝试仅使用一个函数使用golang(和mgo库)查询我的mongodb数据库,而我当前使用的方法是:
1 | er = c.Find(sel(items)).Sort("-createdAt").All(&result) |
其中items是地图,键是我正在db中搜索的字段的名称,而值是我要搜索的内容。
sel()是:
1 2 3 4 5 6 7 | 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 |
当前,如果至少一个字段与输入映射匹配,它将返回所有结果。 (所以是逻辑或),但是我希望它返回这些字段的逻辑与。
是否有人对如何修改现有代码或有效查询数据库的新方法提出建议?
谢谢
- 您能否详细说明所需的逻辑与行为? 匹配所有字段,不是全部?
- 我希望得到一个结果,其中映射中的每个值都与数据库中的相应字段匹配。 因此,我希望它类似于bson.M {" $ and":所有k,v对}
- 是的,匹配所有字段
我不知道这行是什么意思:
1 | result[ ] ="$in" |
由于它是编译时错误。
但是默认情况下,查询文档的元素(条件)处于逻辑"与"连接,因此仅需以下步骤:
1 2 3 4 5 6 7 | func sel(query map[string]string) bson.M { result := make(bson.M, len(query)) for k, v := range query { result[k] = v } return result } |
如果这为您提供了集合中的所有文档,则意味着所有键值对都匹配所有文档。 尝试使用简单的过滤器,看看它是否有效。
另请注意,
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{}.
因此,您可以使用类型为
1 | err = c.Find(items).Sort("-createdAt").All(&result) |
- 我忘了在复制前删除该行! 谢谢。 另外,我们刚刚在我的一位同事的代码中发现了一个错误,该错误导致了我们的"查询"问题,结果甚至没有数据库问题。
-
@bagreeni请参阅我的编辑。 您甚至不需要此
sel() 转换:您可以直接使用原始的map[string]string 映射而无需转换! - 谢谢! 这对了解非常有帮助
- @bagreeni我提供了关于什么可以用作查询的准确描述(带有参考)。