# Аггрегации с нулевыми полями

**URL:** <https://discuss.elastic.co/t/topic/225397>\
**Category:** Вопросы на русском языке\
**Created:** [March 27, 2020, 12:07pm UTC](https://discuss.elastic.co/t/topic/225397 "2020-03-27T12:07:53Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ekaterina\_Nekrasova](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ekaterina_nekrasova/32/46505_2.png) [@Ekaterina\_Nekrasova](https://discuss.elastic.co/u/Ekaterina_Nekrasova)\
**Post date:** [March 27, 2020, 12:07pm UTC](https://discuss.elastic.co/t/topic/225397/1 "2020-03-27T12:07:54Z")

</div>

Всем привет !  
у меня есть тип Person, в котором есть поле GroupId, которое может быть заполненно , может быть нулевым, а так же может даже не существовать,

```json
{
Id: 1
Name : TоTo,
GroupId: 1
}
{
Id: 2
Name : TaTo,
GroupId: 2
}
{
Id: 3
Name : ToTo,
GroupId: 2
}
{
Id: 4
Name : TaTo,
GroupId: null
}
{
Id: 5
Name : TaTa
}

```

Мне необхожимо отсортировать Person по имени и аггрешировать результат по группам, в которых эти люди находятся. Еаким образом человек с нулевой или несуществующей гркппой это человек который сам по себе и так же должен быть представлен в результатах  
пример сортировки по имени и вывод результатов по группе 5, 2, 4, 1

Такое вообще возможно ?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 29, 2020, 8:54pm UTC](https://discuss.elastic.co/t/topic/225397/2 "2020-03-29T20:54:09Z")

</div>

Лучше всего создать еще одно поле в котором будет хранится GroupId или Id, если GroupId отсутствует. Если изменять данные не желательно, то можно воспользоваться [скриптом](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#search-aggregations-bucket-terms-aggregation-script).

---

<div class="post-metadata">

**Author:** ![Ekaterina\_Nekrasova](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ekaterina_nekrasova/32/46505_2.png) [@Ekaterina\_Nekrasova](https://discuss.elastic.co/u/Ekaterina_Nekrasova)\
**Post date:** [March 30, 2020, 10:56am UTC](https://discuss.elastic.co/t/topic/225397/3 "2020-03-30T10:56:47Z")

</div>

Спасибо за ответ!  
Я сделала скрипт прямо в агрегации и таким образом она берет либо GroupId либо Id с минусом, т.к они могут быть одинаковыми

```auto
private readonly string _customGroupIdScript = "if (doc['groupId'].empty || doc['groupId'].value == null || doc['groupId'].value == 0)"
                                                       + "{ return -(Long.parseLong(doc['id'].value)); } "
                                                       + "else { return doc['groupId'].value; }";

```

```auto
body.Aggregations(
                            aggs => aggs
                                    .Terms(
                                        "groupId",
                                        gr => gr
                                              .Script(_customGroupIdScript)
                                              .Order(
                                                  new TermsOrder
                                                  {
                                                      Key = "current_score",
                                                      Order = parameters.Sort.Order == Order.ASC
                                                                  ? appliedSort ? SortOrder.Ascending : SortOrder.Descending
                                                                  : SortOrder.Descending
                                                  })
                                              .Size(parameters.Start + parameters.Length)
                                              .Aggregations(
                                                  aggss => aggss
                                                           .Max("current_score", tt => tt.Script("_score"))
                                                           .TopHits(
                                                               "first_elementid", tt => tt
                                                                                        .Source(s => s.Includes(f => f.Field("id")))
                                                                                        .Size(1))))
                                    .Cardinality("totalDistinct", c => c.Script(_customGroupIdScript))
                        );

```

Спасибо!

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [April 27, 2020, 10:56am UTC](https://discuss.elastic.co/t/topic/225397/4 "2020-04-27T10:56:52Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
