Хранилище данных GAE - как создать неиндексированное свойство сущности

Я использую гибкую среду GAE, .Net и Datastore. Проблема, с которой я столкнулся, заключается в том, что я не могу понять, как удалить индекс, который Datastore автоматически добавляет к каждому свойству Entity.

Я знаю, что могу просматривать объекты на сайте GCP и удалять оттуда индекс, но при этом удаляется только индекс для этого конкретного объекта. Любые добавленные известные сущности по-прежнему будут индексировать это свойство.

Для некоторых других поддерживаемых языков есть атрибуты, которые вы можете добавить в класс, которые сообщают Datastore не индексировать это свойство. Должен быть способ сделать это с помощью .Net, но я его не нашел.

Вот образец класса:

public class MeetingRoom
{
        [Key]
        [Required]
        public long Id { get; set; }

        [Required]
        public string Name { get; set; }

        [DataType(DataType.MultilineText)]
        public string Description { get; set; }

        public ICollection<Notification> Notifications { get; set; }
}

Допустим, свойство Notifications никогда не будет использоваться в запросе. Поэтому вместо того, чтобы оплачивать стоимость дочернего объекта для каждого уведомления, я просто JsonConvert свойство и сохраняю его как строку.

Результирующая Сущность выглядит так:

MeetingRoom room = GetMeetingRoom(34);
Entity entity = new Entity ()
{
    Key = room.Id.ToKey(),
    ["Name"] = room.Name,
    ["Description"] = room.Description,
    ["Notifications"] = JsonConvert.SerializeObject(room.Notifications)
}

В этом примере уведомления истекают через месяц и удаляются из списка. Из-за этого Entity никогда не достигнет лимита в 1 МБ, установленного Datastore. Однако, поскольку уведомления представляют собой индексированную строку, ее длина не может превышать 1500 символов.

Это ограничение в 1500 символов, с которым я столкнулся. Если я смогу понять, как предотвратить индексацию этого свойства в хранилище данных, тогда я смогу жить счастливо в пределах лимита Entity в 1 МБ.

Кто-нибудь может мне с этим помочь?


ОБНОВИТЬ

Вот решение согласно ответу @QuestionAndAnswer

В Entity установка для свойства Value ExcludeFromIndexes значения true предотвратит индексирование свойства.

В моем примере выше исправленная сущность выглядит так:

MeetingRoom room = GetMeetingRoom(34);
Entity entity = new Entity ()
{
    Key = room.Id.ToKey(),
    ["Name"] = room.Name,
    ["Description"] = room.Description,
    ["Notifications"] = new Value()
    {
        StringValue = JsonConvert.SerializeObject(room.Notifications),
        ExcludeFromIndexes = true
    }
}

person Don Shrout    schedule 24.12.2017    source источник


Ответы (1)


Глядя на пример в документации, вы должны передать ExcludeFromIndexes на этапе создания объекта.

https://cloud.google.com/datastore/docs/concepts/indexes#unindexed_properties

person QuestionAndAnswer    schedule 25.12.2017
comment
Спасибо! Не знаю, как я это пропустил. Иногда вам просто нужна вторая пара глаз. Я обновил вопрос примером использования этого решения. - person Don Shrout; 26.12.2017