物化只有键的查询?

问题描述:

我想检查数据库中是否存在cert实体,只使用按键查询。到目前为止,我在做:物化只有键的查询?

Iterable<Key<LikeMW>> liked = ofy().load().type(LikeMW.class).filter("likedObject", postKey).filter("user", userKey).keys(); 

post.setLiked(liked.iterator().hasNext()); 

所以我有2个问题:

1 - 如果我使用 “首先()现在()” 之后 “.keys()”,对不对从“仅键”切换,还是仍然是“仅键”查询?

2 - 有没有更好的方法来检查使用“仅键”查询和过滤器是否存在证书实体?

谢谢你们!

UPDATING

@Entity 
public class LikeMW { 

    @Id 
    private Long id; 

    @JsonIgnore 
    @Index 
    @Load 
    private Ref<UserMW> user; 

    @JsonIgnore 
    @Index 
    private Key likedObject; 

    ... 
} 

和可能喜欢的对象之一......

@Entity 
public class PostMW{ 

    @Id 
    private Long id; 

    @JsonIgnore 
    @Load 
    private Ref<UserMW> owner; 

    @JsonIgnore 
    @Load 
    private Ref<MediaMW> media; 

    ... 
} 
+0

你的第二个问题很难在不知道你的实体的情况下回答。您可以创建一个像@Id一样使用像_ObjectId_userId这样的固定模式的实体。然后你可以直接通过它的键访问实体,只需要一次索引读取。如果你的实体包含超过这两个属性,那不起作用。 – konqi

+0

使用实体更新。 –

用于权威性查找是否存在一个实体的唯一方法是关键加载它。你当然可以做一个只有键的查询,但它会最终一致,并不能保证你不会创建重复。

考虑到您正在尝试做的事情,您几乎可以肯定会更好地使用用户的父母LikeMW并使用串化的LikeObject作为字符串ID。这样你可以做一个强有力的一致查找和使用交易。

+0

关于为用户管理'LikeMW'唯一的问题是1用户可以喜欢成千上万的东西,然后所有的时间我加载一个用户,我会加载数千'LikeMW'在一起。听起来很糟糕。 –

+1

这不是它的工作原理。如果你加载一个'User',你只加载'User'实体中的内容。仅仅因为其他实体具有指向某个User的'@ Parent'字段不会改变'User'的加载行为。 – stickfigure