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-16 16:46:29 +03:00
parent 851fa850a2
commit cfd228d185
9 changed files with 142 additions and 8 deletions

View File

@@ -19,8 +19,12 @@ pub fn json_value_to_bson(value: &Value) -> Result<Bson, String> {
},
Value::Object(obj) => {
if let Some(str) = obj.get("__OPI_STRING__"){
return Ok(Bson::String(str.to_string()))
if let Some(str_value) = obj.get("__OPI_STRING__") {
return if let Value::String(s) = str_value {
Ok(Bson::String(s.clone()))
} else {
Ok(Bson::String(str_value.to_string()))
}
}
if let Some(int32) = obj.get("__OPI_INT32__") {
@@ -87,12 +91,20 @@ pub fn json_value_to_bson(value: &Value) -> Result<Bson, String> {
}
}
if let Some(s) = obj.get("__OPI_JS__"){
return Ok(Bson::JavaScriptCode(s.to_string()))
if let Some(js_value) = obj.get("__OPI_JS__") {
return if let Value::String(s) = js_value {
Ok(Bson::JavaScriptCode(s.clone()))
} else {
Ok(Bson::JavaScriptCode(js_value.to_string()))
}
}
if let Some(s) = obj.get("__OPI_SYMBOL__"){
return Ok(Bson::Symbol(s.to_string()))
if let Some(symbol_value) = obj.get("__OPI_SYMBOL__") {
return if let Value::String(s) = symbol_value {
Ok(Bson::Symbol(s.clone()))
} else {
Ok(Bson::Symbol(symbol_value.to_string()))
}
}
if let Some(_) = obj.get("__OPI_MINKEY__") {

Binary file not shown.

Binary file not shown.

View File

@@ -435,6 +435,88 @@
КонецФункции
// Получить курсор
// Получает курсор для порционного получения документов коллекции
//
// Параметры:
// Соединение - Строка, Произвольный - Соединение или строка подключения - dbc
// Коллекция - Строка - Имя коллекции - coll
// База - Строка - Имя базы. Текущая база, если не указано - db
// Фильтр - Структура Из КлючИЗначение - Фильтр документов - filter
// Сортировка - Структура Из КлючИЗначение - Сортировка выборки - sort
// Параметры - Структура Из КлючИЗначение - Дополнительные параметры получения - params
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат выполнения операции
Функция ПолучитьКурсор(Знач Соединение
, Знач Коллекция
, Знач База = Неопределено
, Знач Фильтр = Неопределено
, Знач Сортировка = Неопределено
, Знач Параметры = Неопределено) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Коллекция);
Если База <> Неопределено Тогда
OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
КонецЕсли;
Если Параметры <> Неопределено Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Параметры);
Иначе
Параметры = Новый Структура;
КонецЕсли;
OPI_Инструменты.ДобавитьПоле("filter", Фильтр , "КлючИЗначение", Параметры);
OPI_Инструменты.ДобавитьПоле("sort" , Сортировка, "КлючИЗначение", Параметры);
Результат = ВыполнитьКоманду(Соединение, "find", Коллекция, База, Параметры);
Возврат Результат;
КонецФункции
// Получить документы
// Получает документы коллекции
//
// Параметры:
// Соединение - Строка, Произвольный - Соединение или строка подключения - dbc
// Коллекция - Строка - Имя коллекции - coll
// База - Строка - Имя базы. Текущая база, если не указано - db
// Фильтр - Структура Из КлючИЗначение - Фильтр документов - filter
// Сортировка - Структура Из КлючИЗначение - Сортировка выборки - sort
// Параметры - Структура Из КлючИЗначение - Дополнительные параметры получения - params
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат выполнения операции
Функция ПолучитьДокументы(Знач Соединение
, Знач Коллекция
, Знач База = Неопределено
, Знач Фильтр = Неопределено
, Знач Сортировка = Неопределено
, Знач Параметры = Неопределено) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Коллекция);
Если База <> Неопределено Тогда
OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
КонецЕсли;
Если Параметры <> Неопределено Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Параметры);
Иначе
Параметры = Новый Структура;
КонецЕсли;
OPI_Инструменты.ДобавитьПоле("filter", Фильтр , "КлючИЗначение", Параметры);
OPI_Инструменты.ДобавитьПоле("sort" , Сортировка, "КлючИЗначение", Параметры);
Результат = ВыполнитьКоманду(Соединение, "find", Коллекция, База, Параметры);
Возврат Результат;
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@@ -411,6 +411,9 @@
ИначеЕсли Тип = "Коллекция" Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Значение);
ИначеЕсли Тип = "КлючИЗначение" Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Значение);
ИначеЕсли Тип = "Булево" Тогда
OPI_ПреобразованиеТипов.ПолучитьБулево(Значение);

View File

@@ -12173,6 +12173,14 @@
Функция Проверка_MongoDB_ВставитьДокументы(Знач Результат, Знач Вариант)
ОжидаетЧто(Результат["result"]).Равно(Истина);
ОжидаетЧто(Результат["data"]["ok"]).Равно(1);
Возврат Результат;
КонецФункции
Функция Проверка_MongoDB_ПолучитьДокументы(Знач Результат, Знач Вариант)
ОжидаетЧто(Результат["result"]).Равно(Истина);
Возврат Результат;

View File

@@ -3239,6 +3239,7 @@
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
MongoDB_ВставитьДокументы(ПараметрыТеста);
MongoDB_ПолучитьДокументы(ПараметрыТеста);
КонецПроцедуры
@@ -24963,6 +24964,7 @@
СтрокаПодключения = OPI_MongoDB.СформироватьСтрокуПодключения(Адрес, , Логин, Пароль, ПараметрыПодключения);
Соединение = OPI_MongoDB.ОткрытьСоединение(СтрокаПодключения);
Коллекция = "new_collection";
МассивДокументов = Новый Массив;
// С неявным приведением типов
@@ -24999,7 +25001,7 @@
СтруктураДокумента.Вставить("symbolField", Новый Структура("__OPI_SYMBOL__" , "Y"));
СтруктураДокумента.Вставить("int32Field" , Новый Структура("__OPI_INT32__" , 10));
СтруктураДокумента.Вставить("int64Field" , Новый Структура("__OPI_INT64__" , 1000));
СтруктураДокумента.Вставить("doubleField", Новый Структура("__OPI_DOUBLE__" , 123.456));
СтруктураДокумента.Вставить("doubleField", Новый Структура("__OPI_DOUBLE__" , 124.456));
СтруктураДокумента.Вставить("boolField" , Новый Структура("__OPI_BOOLEAN__" , Истина));
СтруктураДокумента.Вставить("dateField" , Новый Структура("__OPI_DATETIME__" , "1763204141"));
СтруктураДокумента.Вставить("tsField" , Новый Структура("__OPI_TIMESTAMP__", ТекущаяДата));
@@ -25023,7 +25025,7 @@
МассивДокументов.Добавить(СтруктураДокумента);
Результат = OPI_MongoDB.ВставитьДокументы(Соединение, "new_collection", МассивДокументов, База);
Результат = OPI_MongoDB.ВставитьДокументы(Соединение, Коллекция, МассивДокументов, База);
// END
@@ -25031,6 +25033,33 @@
КонецПроцедуры
Процедура 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", -1);
Параметры = Новый Структура("limit", 2);
Результат = OPI_MongoDB.ПолучитьДокументы(Соединение, Коллекция, База, Фильтр, Сортировка, Параметры);
// END
Обработать(Результат, "MongoDB", "ПолучитьДокументы");
КонецПроцедуры
#КонецОбласти
#КонецОбласти