Например, у нас есть следующий документ в эластичном:
{
"name": "Bob",
"age": "22",
"phrase": "ohohoho",
"date": "2022-10-20T00:00:00Z"
}
строковая фраза ;
ДатаВремя? дата;
Затем мы хотим поставить следующее:
{
"name": "not Bob",
"age": "22",
"phrase": null,
"date": null
}
в С#:
var updateRequest = new UpdateRequest<T, T>(entity)
{
ScriptedUpsert = true,
Script = new InlineScript(
$"if (someCondition) {{ctx._source.putAll(params.entity);}} else {{ctx.op = \"noop\";}}")
{
Lang = "painless",
Params = new Dictionary<string, object>() { { "entity", entity } },
},
Upsert = Activator.CreateInstance<T>()
};
но, в конце концов, он не обновит фразу и дату. Он делает следующий запрос:
POST /myIndex/_update/b90278fd-1a66-40bf-b775-d076122c6c02
{
"script": {
"source": ""if (someCondition) {{ctx._source.putAll(params.entity);}} else {{ctx.op = \"noop\";}}"",
"lang": "painless",
"params": {
"entity": {
"name": "",
"age": 22
}
}
},
"upsert": {
"age": 0
}
}
Не знаю, почему, но он пропускает все поля с нулевым значением. Как обновить поля, допускающие значение null, до нуля?
NEST по умолчанию не поддерживает отправку нулевых значений.
У вас может быть сценарий проверки, чтобы, если значение не было передано, вы могли удалить его из документа.
var updateRequest = new UpdateRequest<T, T(entity)
{
ScriptedUpsert = true,
Script = new InlineScript($"if (params.entity.phrase==null)ctx._source.remove('phrase');")
{
Lang = "painless",
Params = new Dictionary<string, object>() { { "entity", entity } },
},
Upsert = Activator.CreateInstance<T>()
};
Более подробно вы можете узнать здесь
да я рассматривал такой вариант. Но я надеялся, что есть какое-то решение из коробки. В другом случае решение Reflaction или SourceGenerator