# #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)