我正在尝试仅使用一个函数使用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
}

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

另请注意,mgo包还接受广泛的映射和结构,而不仅仅是bson.MCollection.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的地图,而无需对其进行转换:

1
err = c.Find(items).Sort("-createdAt").All(&result)
  • 我忘了在复制前删除该行! 谢谢。 另外,我们刚刚在我的一位同事的代码中发现了一个错误,该错误导致了我们的"查询"问题,结果甚至没有数据库问题。
  • @bagreeni请参阅我的编辑。 您甚至不需要此sel()转换:您可以直接使用原始的map[string]string映射而无需转换!
  • 谢谢! 这对了解非常有帮助
  • @bagreeni我提供了关于什么可以用作查询的准确描述(带有参考)。