2016-11-16 5 views
0

Ich möchte prüfen, ob Cert-Entität in der Datenbank mit nur-Schlüssel-Abfragen vorhanden sind. Bisher habe ich so mache:Objektify Keys-Only-Abfrage?

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

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

So habe ich 2 Fragen:

1 - Wenn ich ".First() now()" nach ".keys()", tut es Wechsel von "keys-only" oder es wird immer noch eine "keys-only" Abfrage sein?

2 - Gibt es eine bessere Möglichkeit, zu überprüfen, ob Cert-Entitäten mit "keys-only" -Abfragen existieren und filtern?

Danke Jungs!

AKTUALISIERUNG

@Entity 
public class LikeMW { 

    @Id 
    private Long id; 

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

    @JsonIgnore 
    @Index 
    private Key likedObject; 

    ... 
} 

Und eine der möglichen mochte Objekte ...

@Entity 
public class PostMW{ 

    @Id 
    private Long id; 

    @JsonIgnore 
    @Load 
    private Ref<UserMW> owner; 

    @JsonIgnore 
    @Load 
    private Ref<MediaMW> media; 

    ... 
} 
+0

Ihre zweite Frage ist schwer zu beantworten, ohne Ihre Entitäten zu kennen. Sie könnten eine Entität erstellen, die ein festes Schema wie likedObjectId_userId als @Id verwendet. Sie könnten dann direkt auf die Entity mit ihrem Schlüssel zugreifen und würden nur einen einzigen Index lesen müssen. Das funktioniert jedoch nicht, wenn Ihre Entität mehr als diese beiden Eigenschaften enthält. – konqi

+0

Aktualisierung mit Entitäten. –

Antwort

1

Die einzige Möglichkeit, bis zu autoritativ schauen, ob ein Unternehmen existiert, ist es von Schlüssel zu laden. Sie können sicherlich eine Nur-Schlüssel-Abfrage durchführen, aber sie wird schließlich konsistent sein und wird nicht garantieren, dass Sie keine Duplikate erstellen.

Angesichts dessen, was Sie versuchen zu tun, werden Sie fast sicher besser Elternteil LikeMW mit dem Benutzer sein und die stringified likedObject als String-ID verwenden. Auf diese Weise können Sie eine konsistente Suche durchführen und Transaktionen verwenden.

+0

Das einzige Problem mit dem "LikeMW" mit Benutzer zu erziehen ist, dass 1 Benutzer Tausende von Sachen mag und dann die ganze Zeit, die ich einen Benutzer lade, werde ich Tausende von 'LikeMW' zusammen laden. Hört sich schlecht an. –

+1

So funktioniert das nicht. Wenn Sie einen "Benutzer" laden, laden Sie nur das, was in der Entität "Benutzer" vorhanden ist. Nur weil eine andere Entität ein '@ Parent'-Feld hat, das auf einen 'User' zeigt, ändert sich das Ladeverhalten von' User' nicht. – stickfigure