这个问题没有单一的正确答案。最佳解决方案主要取决于您的实体在任何给定时间可能处于已删除状态的百分比。
一种选择是存储一个字段@Index(IfTrue.class) boolean active;
,并将此过滤器添加到所有查询中:
ofy.load().type(Thing.class).filter("size >", 20).filter("active", true)
这样做的缺点是它需要添加额外的索引 - 可能是几个,因为您现在可能需要多属性索引,而单属性索引就足够了。
或者,您可以存储“已删除”标志并从查询结果中手动排除已删除的实体。需要维护的索引更少,但是当您拉回不需要的记录时,它会为每个查询增加额外的开销。如果您删除的条目很少,这无关紧要。
最后一招。您可能会发现最好将已删除的日期存储为索引,因为它可能最有用: @Index Date deleted;
这使您filter("deleted", null)
可以获取活动项目,还可以按日期戳过滤以获取您可能希望清除的真正旧实体。但是,请注意,这将导致删除日期索引到任何多属性索引中,如果您的已删除实体百分比很高,则可能会显着增加索引大小。在这种情况下,您可能希望@Index(IfNull.class) Date deleted;
并使用 map-reduce 来清除足够旧的实体。