Как использовать элементы среза в bson.A с помощью mongo-go-driver 0.2.0

Как использовать данный фрагмент для создания bson.A? Мне нужно это сделать динамические запросы.

Я перехожу с mongo-go-driver alpha на бета-версию 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 ответа

Решение

Так что bson.A базовый тип []interface{},

Я мог бы просто использовать append как кусочек

Не уверен, что вы когда-нибудь нашли ответ, но вчера я боролся с этим в течение часа +.

Я не уверен, что это решит то, о чем вы спрашиваете. Я предполагаю, что вы пытаетесь создать фильтр из своего ввода. В конечном итоге я не использовал 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}

      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"})

Вот мой код для удаления нескольких документов на основе идентификатора, который присутствует в другой коллекции.
Сначала мы собираем все идентификаторы из одной коллекции и добавляем в слайс. Затем мы удаляем документы в другой коллекции, используя DeleteMany()

Я показываю соответствующий код, чтобы сохранить код в чистоте.

Джейсон

      [
    {
        "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)
Другие вопросы по тегам