1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-11-23 22:05:15 +02:00

MongoDB: Удаление документов, создание пользователей

This commit is contained in:
Anton Titovets
2025-11-23 16:02:18 +03:00
parent 3b18da2b3e
commit cf699e5b7f
3 changed files with 698 additions and 47 deletions

View File

@@ -435,6 +435,167 @@
КонецФункции
// Обновить документы
// Обновляет данные документов в коллекции
//
// Параметры:
// Соединение - Строка, Произвольный - Соединение или строка подключения - dbc
// Коллекция - Строка - Имя коллекции - coll
// Обновления - Массив Из Структура - Массив обновлений. См. ПолучитьСтруктуруОбновленияДокументов - updates
// База - Строка - Имя базы. Текущая база, если не указано - db
// Параметры - Структура Из КлючИЗначение - Дополнительные параметры вставки - params
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат выполнения операции
Функция ОбновитьДокументы(Знач Соединение
, Знач Коллекция
, Знач Обновления
, Знач База = Неопределено
, Знач Параметры = Неопределено) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Коллекция);
OPI_ПреобразованиеТипов.ПолучитьМассив(Обновления);
Если База <> Неопределено Тогда
OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
КонецЕсли;
Если Параметры <> Неопределено Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Параметры);
Иначе
Параметры = Новый Структура;
КонецЕсли;
МассивОбновлений = Новый Массив;
Для Каждого Элемент Из Обновления Цикл
ТекущийЭлемент = Элемент;
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(ТекущийЭлемент);
МассивОбновлений.Добавить(ТекущийЭлемент);
КонецЦикла;
Параметры.Вставить("updates", МассивОбновлений);
Результат = ВыполнитьКоманду(Соединение, "update", Коллекция, База, Параметры);
Возврат Результат;
КонецФункции
// Получить документы
// Получает документы коллекции
//
// Параметры:
// Соединение - Строка, Произвольный - Соединение или строка подключения - dbc
// Коллекция - Строка - Имя коллекции - coll
// База - Строка - Имя базы. Текущая база, если не указано - db
// Фильтр - Структура Из КлючИЗначение - Фильтр документов - query
// Сортировка - Структура Из КлючИЗначение - Сортировка выборки - sort
// Параметры - Структура Из КлючИЗначение - Дополнительные параметры получения - params
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат выполнения операции
Функция ПолучитьДокументы(Знач Соединение
, Знач Коллекция
, Знач База = Неопределено
, Знач Фильтр = Неопределено
, Знач Сортировка = Неопределено
, Знач Параметры = Неопределено) Экспорт
Курсор = ПолучитьКурсор(Соединение, Коллекция, База, Фильтр, Сортировка, Параметры);
Если Не Курсор["result"] Тогда
Возврат Курсор;
КонецЕсли;
Курсор = Курсор["data"]["cursor"];
МассивДокументов = Курсор["firstBatch"];
IDКурсора = Курсор["id"];
ПродолжатьВыборку = IDКурсора > 0;
Пока ПродолжатьВыборку Цикл
Пакет = ПолучитьПакетДокументов(Соединение, Коллекция, IDКурсора, База);
Успех = Пакет["result"];
Данные = Пакет["data"];
Если Не Успех Тогда
Возврат Пакет;
КонецЕсли;
Курсор = Данные["cursor"];
Если Курсор = Неопределено Тогда
Возврат Пакет;
КонецЕсли;
ПродолжатьВыборку = Курсор["id"] > 0;
Для Каждого Запись Из Курсор["nextBatch"] Цикл
МассивДокументов.Добавить(Запись);
КонецЦикла;
КонецЦикла;
Результат = Новый Соответствие;
Результат.Вставить("result", Истина);
Результат.Вставить("data" , МассивДокументов);
Возврат Результат;
КонецФункции
// Удалить документы
// Удаляет документы коллекции
//
// Параметры:
// Соединение - Строка, Произвольный - Соединение или строка подключения - dbc
// Коллекция - Строка - Имя коллекции - coll
// Удаления - Массив Из Структура - Массив удаления. См. ПолучитьСтруктуруУдаленияДокументов - deletes
// База - Строка - Имя базы. Текущая база, если не указано - db
// Параметры - Структура Из КлючИЗначение - Дополнительные параметры вставки - params
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат выполнения операции
Функция УдалитьДокументы(Знач Соединение
, Знач Коллекция
, Знач Удаления
, Знач База = Неопределено
, Знач Параметры = Неопределено) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Коллекция);
OPI_ПреобразованиеТипов.ПолучитьМассив(Удаления);
Если База <> Неопределено Тогда
OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
КонецЕсли;
Если Параметры <> Неопределено Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Параметры);
Иначе
Параметры = Новый Структура;
КонецЕсли;
МассивОбновлений = Новый Массив;
Для Каждого Элемент Из Удаления Цикл
ТекущийЭлемент = Элемент;
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(ТекущийЭлемент);
МассивОбновлений.Добавить(ТекущийЭлемент);
КонецЦикла;
Параметры.Вставить("deletes", МассивОбновлений);
Результат = ВыполнитьКоманду(Соединение, "delete", Коллекция, База, Параметры);
Возврат Результат;
КонецФункции
// Получить курсор
// Получает курсор для порционного получения документов коллекции
//
@@ -442,7 +603,7 @@
// Соединение - Строка, Произвольный - Соединение или строка подключения - dbc
// Коллекция - Строка - Имя коллекции - coll
// База - Строка - Имя базы. Текущая база, если не указано - db
// Фильтр - Структура Из КлючИЗначение - Фильтр документов - filter
// Фильтр - Структура Из КлючИЗначение - Фильтр документов - query
// Сортировка - Структура Из КлючИЗначение - Сортировка выборки - sort
// Параметры - Структура Из КлючИЗначение - Дополнительные параметры получения - params
//
@@ -513,60 +674,114 @@
КонецФункции
// Получить документы
// Получает документы коллекции
//
// Получить структуру обновления документов
// Формирует структуру данных для обновления документов
//
// Параметры:
// Соединение - Строка, Произвольный - Соединение или строка подключения - dbc
// Коллекция - Строка - Имя коллекции - coll
// База - Строка - Имя базы. Текущая база, если не указано - db
// Фильтр - Структура Из КлючИЗначение - Фильтр документов - filter
// Сортировка - Структура Из КлючИЗначение - Сортировка выборки - sort
// Параметры - Структура Из КлючИЗначение - Дополнительные параметры получения - params
//
// Фильтр - Структура Из КлючИЗначение - Фильтр документов - query
// Данные - Структура Из КлючИЗначение - Новые данные документов для обновления - data
// ОбновитьВсе - Булево - Истина > обновляет все документы по фильтру, Ложь > только один - multi
// Вставлять - Булево - Вставить новый документ, если ни один документ не был найден - upsert
// Сопоставление - Структура Из КлючИЗначение - Особые настройки правил сравнения полей при поиске - cltn
//
// Возвращаемое значение:
// Структура Из КлючИЗначение - Результат закрытия соединения
Функция ПолучитьСтруктуруОбновленияДокументов(Знач Фильтр
, Знач Данные
, Знач ОбновитьВсе = Истина
, Знач Вставлять = Ложь
, Знач Сопоставление = Неопределено) Экспорт
СтруктураОбновления = Новый Структура;
OPI_Инструменты.ДобавитьПоле("q" , Фильтр , "КлючИЗначение", СтруктураОбновления);
OPI_Инструменты.ДобавитьПоле("u" , Данные , "КлючИЗначение", СтруктураОбновления);
OPI_Инструменты.ДобавитьПоле("multi" , ОбновитьВсе , "Булево" , СтруктураОбновления);
OPI_Инструменты.ДобавитьПоле("upsert" , Вставлять , "Булево" , СтруктураОбновления);
OPI_Инструменты.ДобавитьПоле("collation", Сопоставление, "КлючИЗначение", СтруктураОбновления);
Возврат СтруктураОбновления;
КонецФункции
// Получить структуру удаления документов
// Формирует структу данных для обновления
//
// Параметры:
// Фильтр - Структура Из КлючИЗначение - Фильтр документов - query
// Количество - Число - Лимит удаления: 1 > первый документ, 0 > все документы - limit
// Сопоставление - Структура Из КлючИЗначение - Особые настройки правил сравнения полей при поиске - cltn
//
// Возвращаемое значение:
// Структура - Получить структуру удаления документов
Функция ПолучитьСтруктуруУдаленияДокументов(Знач Фильтр, Знач Количество = 0, Сопоставление = Неопределено) Экспорт
СтруктураУдаления = Новый Структура;
OPI_Инструменты.ДобавитьПоле("q" , Фильтр , "КлючИЗначение", СтруктураУдаления);
OPI_Инструменты.ДобавитьПоле("collation", Сопоставление, "КлючИЗначение", СтруктураУдаления);
OPI_ПреобразованиеТипов.ПолучитьЧисло(Количество);
СтруктураУдаления.Вставить("limit", Количество);
Возврат СтруктураУдаления;
КонецФункции
#КонецОбласти
#Область ПользователиИРоли
// Создать пользователя
// Создает нового пользователя
//
// Параметры:
// Соединение - Строка, Произвольный - Соединение или строка подключения - dbc
// Имя - Строка - Имя пользователя - name
// РолиПользователя - Массив Из Произвольный - Массив ролей в виде строк или структур с указанием БД - roles
// База - Строка - Имя базы. Текущая база, если не указано - db
// Пароль - Строка - Пароль пользователя - pwd
// Параметры - Структура Из КлючИЗначение - Дополнительные параметры создания - params
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат выполнения операции
Функция ПолучитьДокументы(Знач Соединение
, Знач Коллекция
Функция СоздатьПользователя(Знач Соединение
, Знач Имя
, Знач РолиПользователя
, Знач База = Неопределено
, Знач Фильтр = Неопределено
, Знач Сортировка = Неопределено
, Знач Пароль = Неопределено
, Знач Параметры = Неопределено) Экспорт
Курсор = ПолучитьКурсор(Соединение, Коллекция, База, Фильтр, Сортировка, Параметры);
Если Не Курсор["result"] Тогда
Возврат Курсор;
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
OPI_ПреобразованиеТипов.ПолучитьМассив(РолиПользователя);
Данные = Новый Структура;
Данные.Вставить("roles", РолиПользователя);
Если Пароль <> Неопределено Тогда
OPI_ПреобразованиеТипов.ПолучитьСтроку(Пароль);
Данные.Вставить("pwd", Пароль);
КонецЕсли;
Курсор = Курсор["data"]["cursor"];
МассивДокументов = Курсор["firstBatch"];
IDКурсора = Курсор["id"];
ПродолжатьВыборку = IDКурсора > 0;
Пока ПродолжатьВыборку Цикл
Пакет = ПолучитьПакетДокументов(Соединение, Коллекция, IDКурсора, База);
Успех = Пакет["result"];
Если Не Успех Тогда
Возврат Пакет;
КонецЕсли;
ПродолжатьВыборку = Пакет["cursor"]["id"] > 0;
Для Каждого Запись Из Пакет["cursor"]["nextBatch"] Цикл
МассивДокументов.Добавить(Запись);
Если Параметры <> Неопределено Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Параметры);
Для Каждого Поле Из Параметры Цикл
Данные.Вставить(Поле.Ключ, Поле.Значение);
КонецЦикла;
КонецЦикла;
Результат = Новый Соответствие;
Результат.Вставить("result", Истина);
Результат.Вставить("data" , МассивДокументов);
КонецЕсли;
Если База <> Неопределено Тогда
OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
КонецЕсли;
Результат = ВыполнитьКоманду(Соединение, "createUser", Имя, База, Данные);
Возврат Результат;
КонецФункции
#КонецОбласти

View File

@@ -12322,6 +12322,186 @@
КонецФункции
Функция Проверка_MongoDB_ОбновитьДокументы(Знач Результат, Знач Вариант)
Вариант = Строка(Вариант);
ОжидаетЧто(Результат["result"]).Равно(Истина);
Если Вариант = "Проверка" Тогда
ОжидаетЧто(Результат["data"].Количество() > 0).Равно(Истина);
ОжидаетЧто(Результат["data"][0]["doubleField"]).Равно(999);
ИначеЕсли Вариант = "Проверка 1" Тогда
ОжидаетЧто(Результат["data"].Количество() > 0).Равно(Истина);
Для Каждого Док Из Результат["data"] Цикл
ОжидаетЧто(Док["price"]).Равно(777);
ОжидаетЧто(Док["inStock"]).Равно(Ложь);
ОжидаетЧто(Док["rating"]).Равно(5);
КонецЦикла;
ИначеЕсли Вариант = "Проверка 2" Тогда
ОжидаетЧто(Результат["data"].Количество() > 0).Равно(Истина);
ОжидаетЧто(Результат["data"][0]["quantity"] > 10).Равно(Истина);
ИначеЕсли Вариант = "Проверка 3" Тогда
ОжидаетЧто(Результат["data"].Количество() > 0).Равно(Истина);
Для Каждого Док Из Результат["data"] Цикл
Найден = Ложь;
Для Каждого Тэг Из Док["tags"] Цикл
Если Тэг = "обновленный" Тогда
Найден = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
ОжидаетЧто(Найден).Равно(Истина);
КонецЦикла;
ИначеЕсли Вариант = "Проверка 4" Тогда
ОжидаетЧто(Результат["data"].Количество() > 0).Равно(Истина);
Для Каждого Док Из Результат["data"] Цикл
ОжидаетЧто(Док["details"]["supplier"]).Равно("Поставщик А+");
ОжидаетЧто(Док["details"]["weightKg"]).Равно(2.5);
КонецЦикла;
ИначеЕсли Вариант = "Проверка 5" Тогда
ОжидаетЧто(Результат["data"].Количество() > 0).Равно(Истина);
ОжидаетЧто(Результат["data"][0]["productName"]).Равно("Новый товар");
ОжидаетЧто(Результат["data"][0]["price"]).Равно(1999);
ИначеЕсли Вариант = "Проверка 6" Тогда
ОжидаетЧто(Результат["data"].Количество() > 0).Равно(Истина);
Для Каждого Док Из Результат["data"] Цикл
ОжидаетЧто(Док["rating"]).Равно(Неопределено);
КонецЦикла;
ИначеЕсли Вариант = "Проверка 7" Тогда
ОжидаетЧто(Результат["data"].Количество() > 0).Равно(Истина);
Для Каждого Док Из Результат["data"] Цикл
ОжидаетЧто(Док["inStock"]).Равно(Ложь);
Найден = Ложь;
Для Каждого Тэг Из Док["tags"] Цикл
Если Тэг = "уценка" Тогда
Найден = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
ОжидаетЧто(Найден).Равно(Истина);
КонецЦикла;
ИначеЕсли Вариант = "Проверка 8_1" Тогда
ОжидаетЧто(Результат["data"].Количество() > 0).Равно(Истина);
Для Каждого Док Из Результат["data"] Цикл
ОжидаетЧто(Док["price"]).Равно(888);
ОжидаетЧто(Док["discounted"]).Равно(Истина);
КонецЦикла;
ИначеЕсли Вариант = "Проверка 8_2" Тогда
ОжидаетЧто(Результат["data"].Количество() > 0).Равно(Истина);
Для Каждого Док Из Результат["data"] Цикл
Найден = Ложь;
Для Каждого Тэг Из Док["tags"] Цикл
Если Тэг = "массовое_обновление" Тогда
Найден = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
ОжидаетЧто(Найден).Равно(Истина);
КонецЦикла;
ИначеЕсли Вариант = "Проверка 8_3" Тогда
ОжидаетЧто(Результат["data"].Количество() > 0).Равно(Истина);
ОжидаетЧто(Результат["data"][0]["productName"]).Равно("Специальный товар из массива");
ОжидаетЧто(Результат["data"][0]["price"]).Равно(1111);
ИначеЕсли Вариант = "Проверка 8_4" Тогда
ОжидаетЧто(Результат["data"].Количество() > 0).Равно(Истина);
Для Каждого Док Из Результат["data"] Цикл
ОжидаетЧто(Док["needsImprovement"]).Равно(Истина);
КонецЦикла;
ИначеЕсли Вариант = "Получение" Тогда
ОжидаетЧто(Результат["data"].Количество()).Равно(0);
ИначеЕсли Вариант = "Получение новых" Тогда
Для Каждого Элемент Из Результат["data"] Цикл
ОжидаетЧто(Элемент["doubleField"]).Равно(999);
КонецЦикла;
ИначеЕсли Вариант = "5" Тогда
ОжидаетЧто(Результат["data"]["upserted"].Количество() > 0 Или Результат["data"]["nModified"] > 0).Равно(Истина);
Иначе
ОжидаетЧто(Результат["data"]["nModified"] > 0).Равно(Истина);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция Проверка_MongoDB_ПолучитьСтруктуруОбновленияДокументов(Знач Результат, Знач Вариант)
ОжидаетЧто(OPI_Инструменты.ЭтоКоллекция(Результат, Истина)).Равно(Истина);
Возврат Результат
КонецФункции
Функция Проверка_MongoDB_УдалитьДокументы(Знач Результат, Знач Вариант)
ОжидаетЧто(Результат["result"]).Равно(Истина);
Если Вариант = "Проверка" Тогда
ОжидаетЧто(Результат["data"].Количество()).Равно(1);
ИначеЕсли Вариант = "Предпроверка" Тогда
ОжидаетЧто(Результат["data"].Количество()).Равно(2);
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область ReportPortal

View File

@@ -3242,6 +3242,9 @@
MongoDB_ПолучитьДокументы(ПараметрыТеста);
MongoDB_ПолучитьКурсор(ПараметрыТеста);
MongoDB_ПолучитьПакетДокументов(ПараметрыТеста);
MongoDB_ОбновитьДокументы(ПараметрыТеста);
MongoDB_УдалитьДокументы(ПараметрыТеста);
MongoDB_ПолучитьСтруктуруОбновленияДокументов(ПараметрыТеста);
КонецПроцедуры
@@ -25266,6 +25269,259 @@
КонецПроцедуры
Процедура MongoDB_ОбновитьДокументы(ПараметрыФункции)
Адрес = "127.0.0.1:1234";
Логин = ПараметрыФункции["MongoDB_User"];
Пароль = ПараметрыФункции["MongoDB_Password"];
База = ПараметрыФункции["MongoDB_DB"];
Адрес = OPI_ПолучениеДанныхТестов.ПолучитьLocalhost() + ":" + ПараметрыФункции["MongoDB_Port"]; // SKIP
ПараметрыПодключения = Новый Структура("authSource", "admin");
СтрокаПодключения = OPI_MongoDB.СформироватьСтрокуПодключения(Адрес, , Логин, Пароль, ПараметрыПодключения);
Соединение = OPI_MongoDB.ОткрытьСоединение(СтрокаПодключения);
Коллекция = "new_collection";
// __4 = $
Фильтр = Новый Структура("stringField,doubleField", "Текст", Новый Структура("__4gte, __4lte", 100, 150));
Данные = Новый Структура( "__4set", Новый Структура("doubleField", 999));
Обновление = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр, Данные); // Массив или одиночное
Результат = OPI_MongoDB.ОбновитьДокументы(Соединение, Коллекция, Обновление, База);
// END
Обработать(Результат, "MongoDB", "ОбновитьДокументы");
Параметры = Новый Структура("limit,batchSize", 2, 1);
Сортировка = Новый Структура("doubleField", -1);
Результат = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр, Сортировка, Параметры);
Обработать(Результат, "MongoDB", "ОбновитьДокументы", "Получение");
Фильтр = Новый Структура("stringField,doubleField", "Текст", 999);
Результат = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр, Сортировка, Параметры);
Обработать(Результат, "MongoDB", "ОбновитьДокументы", "Получение новых");
// Multiply fields
Фильтр = Новый Структура("category", "электроника");
Данные = Новый Структура("__4set", Новый Структура("price,inStock,rating", 777, Ложь, 5));
Обновление = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр, Данные, Истина);
Результат = OPI_MongoDB.ОбновитьДокументы(Соединение, Коллекция, Обновление, База);
Обработать(Результат, "MongoDB", "ОбновитьДокументы", 1);
Фильтр = Новый Структура("category", "электроника", "price", 777);
РезультатПроверки = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр);
Обработать(РезультатПроверки, "MongoDB", "ОбновитьДокументы", "Проверка 1");
// Number inc
Фильтр = Новый Структура("productName", "Товар 1");
Данные = Новый Структура("__4inc", Новый Структура("quantity", 10));
Обновление = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр, Данные);
Результат = OPI_MongoDB.ОбновитьДокументы(Соединение, Коллекция, Обновление, База);
Обработать(Результат, "MongoDB", "ОбновитьДокументы", 2);
Фильтр = Новый Структура("productName", "Товар 1");
РезультатПроверки = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр);
Обработать(РезультатПроверки, "MongoDB", "ОбновитьДокументы", "Проверка 2");
// Array insertion
Фильтр = Новый Структура("productName", "Товар 2");
Данные = Новый Структура("__4push", Новый Структура("tags", "обновленный"));
Обновление = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр, Данные);
Результат = OPI_MongoDB.ОбновитьДокументы(Соединение, Коллекция, Обновление, База);
Обработать(Результат, "MongoDB", "ОбновитьДокументы", 3);
Фильтр = Новый Структура("productName", "Товар 2", "tags", "обновленный");
РезультатПроверки = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр);
Обработать(РезультатПроверки, "MongoDB", "ОбновитьДокументы", "Проверка 3");
// Nested field update
СоответствиеУстановки = Новый Соответствие;
СоответствиеУстановки.Вставить("details.weightKg", 2.5);
СоответствиеУстановки.Вставить("details.supplier", "Поставщик А+");
Фильтр = Новый Соответствие;
Фильтр.Вставить("details.supplier", "Поставщик А");
Данные = Новый Структура("__4set", СоответствиеУстановки);
Обновление = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр, Данные, Истина);
Результат = OPI_MongoDB.ОбновитьДокументы(Соединение, Коллекция, Обновление, База);
Обработать(Результат, "MongoDB", "ОбновитьДокументы", 4);
Фильтр = Новый Соответствие;
Фильтр.Вставить("details.supplier", "Поставщик А+");
Фильтр.Вставить("details.weightKg", 2.5);
РезультатПроверки = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр);
Обработать(РезультатПроверки, "MongoDB", "ОбновитьДокументы", "Проверка 4");
// Upsert
Фильтр = Новый Структура("productName", "Новый товар");
//@skip-check structure-consructor-too-many-keys
Данные = Новый Структура("__4set", Новый Структура("productName,category,price,quantity,inStock,createdDate"
, "Новый товар"
, "электроника"
, 1999
, 1
, Истина
, OPI_Инструменты.ПолучитьТекущуюДату()
));
Обновление = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр, Данные, Ложь, Истина);
Результат = OPI_MongoDB.ОбновитьДокументы(Соединение, Коллекция, Обновление, База);
Обработать(Результат, "MongoDB", "ОбновитьДокументы", 5);
Фильтр = Новый Структура("productName", "Новый товар");
РезультатПроверки = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр);
Обработать(РезультатПроверки, "MongoDB", "ОбновитьДокументы", "Проверка 5");
// Field removing
Фильтр = Новый Структура("productName", "Товар 3");
Данные = Новый Структура("__4unset", Новый Структура("rating", ""));
Обновление = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр, Данные);
Результат = OPI_MongoDB.ОбновитьДокументы(Соединение, Коллекция, Обновление, База);
Обработать(Результат, "MongoDB", "ОбновитьДокументы", 6);
Фильтр = Новый Структура("productName", "Товар 3");
Параметры = Новый Структура("projection", Новый Структура("productName,rating", 1, 1));
РезультатПроверки = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр, Неопределено, Параметры);
Обработать(РезультатПроверки, "MongoDB", "ОбновитьДокументы", "Проверка 6");
// Multiply operators
Фильтр = Новый Структура("price", Новый Структура("__4lt", 200));
Данные = Новый Структура;
Данные.Вставить("__4set", Новый Структура("inStock", Ложь));
Данные.Вставить("__4inc", Новый Структура("quantity", -5));
Данные.Вставить("__4push", Новый Структура("tags", "уценка"));
Обновление = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр, Данные, Истина);
Результат = OPI_MongoDB.ОбновитьДокументы(Соединение, Коллекция, Обновление, База);
Обработать(Результат, "MongoDB", "ОбновитьДокументы", 7);
Фильтр = Новый Структура("price,tags", Новый Структура("__4lt", 200), "уценка");
РезультатПроверки = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр);
Обработать(РезультатПроверки, "MongoDB", "ОбновитьДокументы", "Проверка 7");
// Updates array
МассивОбновлений = Новый Массив;
Фильтр1 = Новый Структура("category", "электроника");
Данные1 = Новый Структура("__4set", Новый Структура("price,discounted", 888, Истина));
Обновление1 = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр1, Данные1, Истина);
МассивОбновлений.Добавить(Обновление1);
Фильтр2 = Новый Структура("category", "одежда");
Данные2 = Новый Структура("__4inc", Новый Структура("quantity", 5));
Обновление2 = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр2, Данные2, Истина);
МассивОбновлений.Добавить(Обновление2);
Фильтр3 = Новый Структура("category", "книги");
Данные3 = Новый Структура("__4push", Новый Структура("tags", "массовое_обновление"));
Обновление3 = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр3, Данные3, Истина);
МассивОбновлений.Добавить(Обновление3);
Фильтр4 = Новый Структура("productName", "Специальный товар из массива");
//@skip-check structure-consructor-too-many-keys
Данные4 = Новый Структура("__4set", Новый Структура("productName,category,price,quantity,inStock,createdDate"
, "Специальный товар из массива"
, "специальная"
, 1111
, 7
, Истина
, OPI_Инструменты.ПолучитьТекущуюДату()
));
Обновление4 = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр4, Данные4, Ложь, Истина);
МассивОбновлений.Добавить(Обновление4);
Фильтр5 = Новый Структура("rating", Новый Структура("__4lte", 2));
Данные5 = Новый Структура;
Данные5.Вставить("__4set", Новый Структура("needsImprovement", Истина));
Данные5.Вставить("__4inc", Новый Структура("quantity", -2));
Обновление5 = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр5, Данные5, Истина);
МассивОбновлений.Добавить(Обновление5);
Результат = OPI_MongoDB.ОбновитьДокументы(Соединение, Коллекция, МассивОбновлений, База);
Обработать(Результат, "MongoDB", "ОбновитьДокументы", 9);
Фильтр = Новый Структура("category,price", "электроника", 888);
РезультатПроверки = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр);
Обработать(РезультатПроверки, "MongoDB", "ОбновитьДокументы", "Проверка 8_1");
Фильтр = Новый Структура("category,tags", "книги", "массовое_обновление");
РезультатПроверки = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр);
Обработать(РезультатПроверки, "MongoDB", "ОбновитьДокументы", "Проверка 8_2");
Фильтр = Новый Структура("productName", "Специальный товар из массива");
РезультатПроверки = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр);
Обработать(РезультатПроверки, "MongoDB", "ОбновитьДокументы", "Проверка 8_3");
Фильтр = Новый Структура("needsImprovement", Истина);
РезультатПроверки = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр);
Обработать(РезультатПроверки, "MongoDB", "ОбновитьДокументы", "Проверка 8_4");
КонецПроцедуры
Процедура MongoDB_ПолучитьСтруктуруОбновленияДокументов(ПараметрыФункции)
// __4 = $
Фильтр = Новый Структура("stringField,doubleField", "Текст", Новый Структура("__4gte, __4lte", 100, 150));
Данные = Новый Структура( "__4set", Новый Структура("doubleField", 999));
Результат = OPI_MongoDB.ПолучитьСтруктуруОбновленияДокументов(Фильтр, Данные, Истина, Истина);
// END
Обработать(Результат, "MongoDB", "ПолучитьСтруктуруОбновленияДокументов");
КонецПроцедуры
Процедура MongoDB_УдалитьДокументы(ПараметрыФункции)
Адрес = "127.0.0.1:1234";
Логин = ПараметрыФункции["MongoDB_User"];
Пароль = ПараметрыФункции["MongoDB_Password"];
База = ПараметрыФункции["MongoDB_DB"];
Адрес = OPI_ПолучениеДанныхТестов.ПолучитьLocalhost() + ":" + ПараметрыФункции["MongoDB_Port"]; // SKIP
ПараметрыПодключения = Новый Структура("authSource", "admin");
СтрокаПодключения = OPI_MongoDB.СформироватьСтрокуПодключения(Адрес, , Логин, Пароль, ПараметрыПодключения);
Соединение = OPI_MongoDB.ОткрытьСоединение(СтрокаПодключения);
Коллекция = "new_collection";
Фильтр = Новый Структура("stringField,doubleField", "Текст", 999);
Удаление = OPI_MongoDB.ПолучитьСтруктуруУдаленияДокументов(Фильтр, 1); // Массив или одиночное
Результат = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр); // SKIP
Обработать(Результат, "MongoDB", "УдалитьДокументы", "Предпроверка"); // SKIP
Результат = OPI_MongoDB.УдалитьДокументы(Соединение, Коллекция, Удаление, База);
// END
Обработать(Результат, "MongoDB", "УдалитьДокументы");
Результат = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр);
Обработать(Результат, "MongoDB", "УдалитьДокументы", "Проверка");
КонецПроцедуры
#КонецОбласти
#КонецОбласти