Golang BSON 转换

6

我正在尝试将一个在mongo中工作的查询转换为golang中的bson格式。我已经掌握了基本操作并使其正常运行,但是我无法弄清楚如何将更高级的查询集成到其中。

有人能帮我转换以下查询吗?这应该可以给我所需的方向...不幸的是,我还没有找到许多除了对查询进行评估之外的例子。

这在mongo中有效:

db.my_collection.find({"$or": [
      {"dependencies.provider_id": "abc"}, 
      {"actions.provider_id": "abc"}]})

这段代码适用于golang/bson:

bson.M{"dependencies.provider_id": "abc"}

我该如何正确地介绍or语句?

3个回答

9

为了完整起见,在上面的评论中,这是我上一个问题的完整示例。更大的目标是在go中动态构建bson查询。非常感谢ANisus:

query := bson.M{}
query["origin"] = "test"
query["$or"] = []bson.M{}
query["$or"] = append(query["$or"].([]bson.M), bson.M{"abc": "1"})
query["$or"] = append(query["$or"].([]bson.M), bson.M{"def": "2"})

7
在您的情况下,需要这样做:
bson.M{"$or": []bson.M{
    {"dependencies.provider_id": "abc"},
    {"actions.provider_id": "abc"},
}}

我知道这是一些简单的东西,每个键/值对都缺少bson.M。你太棒了,非常感谢。 - Mark Hayden
在等待7分钟接受您的答案时,我有另一个快速问题。是否有一种简单的方法可以“推入”到现有的bson变量中?例如,如果上面是query := ....,那么我想运行一个if并可能添加更多内容。 - Mark Hayden
@MarkHayden 请随意开启一个新问题。 - nemo
1
@MarkHayden 欢迎!是的,这很简单。bson.M 的底层类型是 map[string]interface{},所以你可以将其视为普通的 map:query["$or"] = append(query["$or"].([]bson.M), bson.M{"another_or": "abc"}) - ANisus
@MarkHayden 我移除了不必要的 bson.M,因为它们由 []bson.M 隐式设置。 - ANisus

1
像这样
package main
import "github.com/globalsign/mgo/bson"

query := make([]map[string]interface{}, 0)
query = append(query, map[string]interface{}{"dependencies.provider_id": "abc"})
query = append(query, map[string]interface{}{"actions.provider_id": "abc"})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接