diff --git a/src/ru/OPI/src/CommonModules/OPI_MongoDB/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_MongoDB/Module.bsl index a5f0de6d25..c88ff805c6 100644 --- a/src/ru/OPI/src/CommonModules/OPI_MongoDB/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_MongoDB/Module.bsl @@ -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", Имя, База, Данные); Возврат Результат; - + КонецФункции #КонецОбласти diff --git a/src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl index 2679f34703..3f0dd77524 100644 --- a/src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl @@ -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 diff --git a/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl index 3136c93150..c30e613fbd 100644 --- a/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl @@ -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", "УдалитьДокументы", "Проверка"); + +КонецПроцедуры + #КонецОбласти #КонецОбласти