Я использую гибкую среду 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
}
}