GAE 数据存储 - 如何创建非索引实体 属性

GAE Datastore - How to create non-indexed Entity Property

我正在使用 GAE 灵活环境、.Net 和数据存储。 我遇到的问题是我无法弄清楚如何删除 Datastore 自动添加到实体的每个 属性 的索引。

我知道我可以查看 GCP 站点上的实体并从那里删除索引,但它只会删除该特定实体的索引。添加的任何已知实体仍将索引 属性.

对于某些其他受支持的语言,您可以将一些属性添加到 class 中,这些属性会告诉 Datastore 不要为 属性 编制索引。一定有办法用 .Net 做到这一点,但我还没有找到它。

这是一个示例 class:

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; }
}

假设通知 属性 永远不会在查询中使用。因此,我没有为每个通知支付拥有子实体的成本,而是简单地 JsonConvert 属性 并将其存储为字符串。

生成的实体如下所示:

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

对于此示例,通知会在一个月后过期并从列表中删除。因此,实体永远不会达到 Datastore 施加的 1MiB 限制。但是,由于通知是一个索引字符串,因此限制为 1500 个字符。

我正在反对这个 1500 个字符的限制。如果我能弄清楚如何防止数据存储索引 属性,那么我就可以在 1MiB 实体限制内快乐地生活。

谁能帮我解决这个问题?


更新

根据@QuestionAndAnswer

的回答,这是解决方案

在实体中,将值 属性 的 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
    }
}

查看文档中的示例,您应该在实体创建步骤中传递 ExcludeFromIndexes

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