Правильный шаблонный многопольный запрос с официальным драйвером mongo-go - PullRequest
1 голос
/ 13 октября 2019

У меня есть поле базы данных:

            "sessionid": "C-dhf",
            "given": "NURSE ",
            "family": "SHARK",
            "name": "SHARK, NURSE",

Я пытаюсь создать запрос, который будет запрашивать базу данных, ища записи о том, что семейство начинается с "s", а имя начинается с "n". Я использую следующее для создания фильтра.

        {"sessionid", "C-dhf"},
        {"$and", bson.A{
            bson.D{{"family", primitive.Regex{Pattern: "^s", Options: "i"}}},
            bson.D{{"given", primitive.Regex{Pattern: "^n", Options: "i"}}},
        }},
    }

Значение фильтра, использованное в поиске:

[{sessionid C-dhf} {$and [[{family {"pattern": "^s", "options": "i"}}] [{given {"pattern": "^n", "options": "i"}}]]}]

Находка:

cursor, err := collection.Find(context.TODO(), filter, findOptions)

Он возвращает все записи в БД, как будто он даже не смотрит на фильтр.

Каков правильный синтаксис go для запроса с подстановочными знаками из нескольких полей?

1 Ответ

1 голос
/ 13 октября 2019

По умолчанию все перечисленные условия находятся в логическом соединении AND ($and), поэтому вам не нужно добавлять следующее:

filter := bson.D{
    {"sessionid", "C-dhf"},
    {"family", primitive.Regex{Pattern: "^s", Options: "i"}},
    {"given", primitive.Regex{Pattern: "^n", Options: "i"}},
}

Синтаксис и структура, которые вы использовали, будут подходящими, если вы 'я хотел логическое ИЛИ соединение: если вам нужны документы с данным идентификатором сеанса и фамилия которого начинается с s или имя начинается с n. Это может выглядеть так:

filter := bson.D{
    {"sessionid", "C-dhf"},
    {"$or", bson.A{
        bson.D{{"family", primitive.Regex{Pattern: "^s", Options: "i"}}},
        bson.D{{"given", primitive.Regex{Pattern: "^n", Options: "i"}}},
    }},
}
...