Как запросить только несколько полей?

Это моя структура.
type Test struct {
	Id    primitive.ObjectID `json:"id" bson:"_id,omitempty" db:"_id"`
	Tasks []Task             `json:"tasks" bson:"tasks" db:"tasks"`
}

type Task struct {
	Description string `json:"description" bson:"description" db:"description"`
	Answer      string `json:"answer" bson:"answer" db:"answer"`
	Balls       int    `json:"balls" bson:"balls" db:"balls"`
}

Эта функция работающая с БД. Если answers = true то все работает хорошо. Но если answers = false то сразу же ошибка
(Location31254) Cannot do exclusion on field answer in inclusion projection

func (r *TestsRepo) GetTestByIdRepo(id string, answers bool) (*vpr.Test, *vpr.Error) {
	var test vpr.Test

	objectId, errID := primitive.ObjectIDFromHex(id)

	if errID != nil {
		return nil, SetError(http.StatusNotFound, "Is not a valid ObjectID")
	}

	options := options.FindOne().SetProjection(bson.M{
		"tasks": bson.M{
			"answer":      answers,
			"balls":       true,
			"description": true,
		},
	})

	filter := bson.M{"_id": objectId}

	err := r.db.FindOne(nil, filter, options).Decode(&test)

	if err != nil {
		return nil, SetError(http.StatusInternalServerError, err.Error())
	}

	return &test, nil
}
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Вам просто не нужно вообще включать answer в Projection. Должно быть достаточно:
bson.M{
    "tasks": bson.M{
      "balls":  1,
      "description":  1,
    },
}

Ну и наоборот, вот так должно работать:
bson.M{
    "tasks": bson.M{
      "answer":  0,
    },
}

Или что хотим включить или что исключить.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы