如何使用mongo-go-driver 0.2.0在bson.A中使用切片的元素

gc0ot86w  于 2023-09-28  发布在  Go
关注(0)|答案(4)|浏览(120)

如何使用给定的切片生成bson.A?我需要这个来进行动态查询。
我正在从mongo-go-driver alpha升级到beta 0.2.0,这已经成为我项目中的一个主要变化,因为API现在不同了。
https://godoc.org/github.com/mongodb/mongo-go-driver/bson

input := []string{"bar", "world"}
//expected output
bson.A{"bar", "world"}
nlejzf6q

nlejzf6q1#

不知道你是否找到了你的答案,但我昨天和这个问题斗争了一个小时。
我不确定这能解决你的问题。我假设你试图从你的输入中构建一个过滤器。最终,当我试图传递数组时,我没有使用bson. A。
场景:试图构建一个过滤器,其中一个bson.D元素是一个数组。
我以为我需要使用BSON. A。
我最初的假设是:

return bson.D{
  {"uuid", request.Uuid},
  {"action", request.Action},
  {"resource", bson.D{{"$in", bson.A{resourceStrings}}}},
}

其中resourceStrings是一个字符串切片。
但是,这最终将构建一个类似于FILTER : [ {resource [{$in [[Orgs::Organizations::1 Orgs::Organizations::* Orgs::Organizations Orgs::*]]}]}]的过滤器

  • 注意,$in方法在这里查找数组的数组。

我们想要的是:FILTER : [{uuid 80} {action UpdateOrganization} {resource [{$in [Orgs::Organizations::1 Orgs::Organizations::* Orgs::Organizations Orgs::*]}]}]
如果我们传入一个字符串的文字数组,它将工作...

return bson.D{
  {"uuid", request.Uuid},
  {"action", request.Action},
  {"resource", bson.D{{"$in", bson.A{"Orgs::Organizations::1", "Orgs::Organizations::*", "Orgs::Organizations", "Orgs::*"}}}},
}

经过一些尝试和错误,我发现bson.D将直接接受数组。
最后我就这样解决了这个问题

return bson.D{
  {"uuid", request.Uuid},
  {"action", request.Action},
  {"resource", bson.D{{"$in", resourceStrings}}},
}

从字面上看你的例子-如果你只是想把一个数组封送到一个bson.A尝试:
bson.A{input}

hfyxw5xn

hfyxw5xn2#

bson.底层类型是[]interface{}
我可以像切片一样使用append

dsf9zpds

dsf9zpds3#

下面是我的代码,根据ID删除存在于另一个集合中的多个文档。
我们首先从一个集合中收集所有ID并添加到切片中。然后我们使用DeleteMany()删除另一个集合中的文档
我展示了相关的代码,以保持代码的整洁。

Json

[
    {
        "id": "602607bcfdc0548bfebbd0c7",
        "subject": "SUBJECT",
        "system": "SYSTEM",
        "board": "BOARD",
        "series": "SERIES",
        "paper": "PAPER",
        "year": "2021",
        "month": "February",
        "question_hex_ids": [
            "602607bcfdc0548bfebbd0c4",
            "602607bcfdc0548bfebbd0c5",
            "602607bcfdc0548bfebbd0c6"
        ]
    }
]

代码

var hexIDCollection []primitive.ObjectID
    database := db.Conn.Database("mydatabase")
    question := database.Collection("questions")

    //Iterating to collect IDs from paper
    for k, _ := range mystruct.question_hex_ids {

        // fetching all IDs and appending to slice
        ids := mystruct.question_hex_ids[k]
        hexID, err := primitive.ObjectIDFromHex(ids)
        if err != nil {
            fmt.Println("ObjectIDFromHex ERROR", err)
        }

        //Populating a slice of all the IDs
        hexIDCollection = append(hexIDCollection, hexID)
    }

    filter := bson.D{
        {"_id", bson.D{{"$in", hexIDCollection}}}, }

    deleteResult, err1 := question.DeleteMany(ctx, filter)
    if err != nil {
        fmt.Println("Question Deletion Error", err1)
    }

    fmt.Println("All questions Deleted: ", deleteResult)
f87krz0w

f87krz0w4#

query := bson.M{
  "$and" : bson.A{
    bson.M{"first_name": "bar"},
    bson.M{"second_name" : "foo"},
   },
}

query["$and"] = append(query["$and"], bson.M{"third_name": "doe"})

相关问题