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 实体限制内快乐地生活。
谁能帮我解决这个问题?
更新
的回答,这是解决方案
在实体中,将值 属性 的 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
我正在使用 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 实体限制内快乐地生活。
谁能帮我解决这个问题?
更新
的回答,这是解决方案在实体中,将值 属性 的 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