2

如何使用给定的切片来生成 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"}
4

3 回答 3

5

不确定您是否找到了答案,但我昨天为此奋斗了一个多小时。

我不肯定这会解决你的问题。我假设您正在尝试根据输入构建过滤器。最终,当我尝试传递数组时,我没有使用 bson.A。

情况:试图构建一个过滤器并且 bson.D 元素之一是一个数组。

以为我需要使用 bson.A。

我最初的假设:

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

whereresourceStrings是一片字符串。

然而,这最终将构建一个看起来像 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}

于 2019-07-26T20:41:18.977 回答
3

所以 bson.A 基础类型是[]interface{},

我可以append像切片一样使用它

于 2019-01-23T22:54:02.000 回答
0

这是我根据 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)
于 2021-02-12T06:03:22.963 回答