Как добавить к объекту bson

# #mongodb #go

Вопрос:

У меня есть конечная точка, где пользователи могут фильтровать коллекцию mongo с помощью параметров запроса. Если у меня есть только один параметр запроса , например title , я могу сделать это —

 filter := bson.M{}

if params.Title != "" {
    filter = bson.M{"title": params.Title}
}
 

Однако, если у меня есть более одного параметра запроса, я, похоже, не могу понять, как добавить его к bson объекту.

Я попробовал это —

 filter := []bson.M{}

if params.Title != "" {
    filter = append(filter, bson.M{"title": params.Title})
}

if params.Description != "" {
    filter = append(filter, bson.M{"description": params.Description})
}
 

но я получил эту ошибку — cannot transform type []primitive.M to a BSON Document: WriteArray can only write a Array while positioned on a Element or Value but is positioned on a TopLevel

Как мне решить эту проблему?

Ответ №1:

bson.M{} подчеркнуто map[string]interface{} в go-mongo-драйвере. Поэтому, если вам нужно добавить больше элементов, вы не можете добавлять. Просто назначьте это значение ключу карты, как показано ниже.

     filter := bson.M{}
    
    if params.Title != "" {
        //filter = bson.M{"title": params.Title}
        filter["title"] = params.Title
    }

    if params.Description != "" {
        filter["description"] =  params.Description
    }
 

Ответ №2:

Рассмотрим коллекцию test с документом: { "_id" : 1, "Title" : "t-1", "Description" : "d-1" } И вы можете использовать следующее:

 title := "t-1"
description := ""    // or "d-1"
filter := bson.M{}

if Title != "" {
    filter["Title"] = title
}

if Description != "" {
    filter["Description"] = description
}

//fmt.Println(filter);

var result bson.M

collection := client.Database("test").Collection("test")
err := collection.FindOne(context.TODO(), filter).Decode(amp;result)
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Found a single document: % vn", result)