Динамический запрос mongodb с Голангом - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь запросить мою базу данных mongodb, используя golang (и библиотеку mgo) только с одной функцией, и метод, который я сейчас использую:

er = c.Find(sel(items)).Sort("-createdAt").All(&result)

Где элементы - это карта, а ключ - это имя поля, которое я ищу в БД, а значение - это то, по чему я хочу искать.

и sel ():

func sel(query map[string]string) bson.M {
result := make(bson.M, len(query))
result[ ] = "$in"
for k, v := range query {
    result[k] = v
}
return result

в настоящее время он вернет все результаты, где хотя бы одно из полей соответствует входной карте. (Таким образом, логическое ИЛИ) однако я хотел бы, чтобы он возвращал логическое И этих полей.

У кого-нибудь есть предложения о том, как изменить существующий код или новый способ эффективного запроса к базе данных?

Спасибо

1 Ответ

0 голосов
/ 27 июня 2018

Я не знаю, что эта строка должна означать:

result[ ] = "$in"

Так как это ошибка времени компиляции.

Но элементы документа запроса (условия) по умолчанию находятся в логическом соединении AND, поэтому это все, что нужно:

func sel(query map[string]string) bson.M {
    result := make(bson.M, len(query))
    for k, v := range query {
        result[k] = v
    }
    return result
}

Если это дает вам все документы в коллекции, то это означает, что все пары ключ-значение соответствуют всем документам. Поэкспериментируйте с простыми фильтрами, чтобы убедиться, что это работает.

Также обратите внимание, что пакет mgo также поддерживает широкий спектр карт и структур, а не только bson.M. Документация Collection.Find() имеет это сказать о разрешенных типах:

Документ может быть картой или структурным значением, которое можно маршалировать с помощью bson. Карта может быть общей, использующей интерфейс {} для его ключа и / или значений, таких как bson.M, или это может быть карта правильно типизированной. Предоставление nil как документа эквивалентно предоставлению пустого документа, такого как bson.M {}.

Таким образом, вы можете использовать свою карту типа map[string]string без ее преобразования:

err = c.Find(items).Sort("-createdAt").All(&result)
...