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

时间:2019-01-20 11:32:59

标签: go mongo-go

如何使用给定的切片生成bson.A?我需要使用它来进行动态查询。

我正在从mongo-go-driver alpha升级到beta 0.2.0,由于我的API现在有所不同,这已成为我项目中的重大更改。

https://godoc.org/github.com/mongodb/mongo-go-driver/bson

.envrc

3 个答案:

答案 0 :(得分:1)

不确定您是否找到答案,但是昨天我与这个争夺了一个多小时。

我不太肯定这会解决您的要求。我假设您正在尝试从输入中构建过滤器。最终,当我尝试传递数组时,我没有使用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,请尝试:

bson.A{input}

答案 1 :(得分: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)

答案 2 :(得分:-1)

所以bson。基础类型是[]interface{}

我可以像切片一样使用append