2015-06-07 4 views
0

Я использую Objectify в AppEngine от Google. У меня есть следующий Entity-модель:Objectify: Фильтровать по атрибуту записей коллекции?

@Entity 
public class ChallengeEntity { 

    @Id 
    private Long id; 

    @Index 
    public List<ChallengeParticipant> participants; 
} 

участника (не сущность ... она должна быть одна?)

public class ChallengeParticipant { 
    @Load 
    public Ref<UserEntity> user; 

    // ... participant-specific attributes 
} 

И User-Entity:

@Entity 
public class UserEntity { 

    @Id 
    Long id; 

    @Index 
    public String email = ""; 
} 

Теперь, как бы я нашел все проблемы для данного пользователя-электронной почты? Что-то вдоль:

ofy().load().type(ChallengeEntity.class).filter("participants.user.email", "[email protected]") 

Я готов адаптировать свою сущность-модель для нужд GAE в ... как я могу поддерживать этот запрос эффективно и сохранить хорошую модель?

Большое спасибо

ответ

1

Предполагая, что ваш список ChallengeParticipant достаточно ограничен (не более нескольких сотен), и вы не рискуете нанести ограничение по 1M на сущность, вы, вероятно, лучше всего оставите его как встроенный.

Чтобы выполнить запрос, первый LookUp человека по электронной почте, затем процеживают лицом:

UserEntity user = // load user (or get the key) by email 
ofy().load().type(ChallengeEntity.class).filter("participants.user", user); 

Обратите внимание, что вам нужно @Index в ChallengeParticipant.user поле, а не ChallengeEntity.participants список.

+0

Благодарим за упоминание «@ Index» пользователя, а не участников ... но почему? – hotzen

+1

'@ Index' в коллекции означает« индексировать все поля каждого элемента в этой коллекции ». Вы хотите только проиндексировать одно поле. – stickfigure

1

Если предположить, что электронная почта является уникальным для пользователя, я бы держать ChallengeParticipant как отдельное юридическое лицо и поддерживать 2 способ отношения с ChallangeEntity:

public class ChallengeParticipant { 
    @Id 
    String email; // must be able to uniquely identify a user. 
    List<Ref<ChallengeEntity>> challenges; 
    // ... participant-specific attributes 
} 

ChallengeEntity будет существовать как, но без любой @Index

@Entity 
public class ChallengeEntity { 
    @Id 
    private Long id; 
    public List<Ref<ChallengeParticipant>> participants; 
} 

Если вы хотите добавить нового участника в вызов, обновите оба объекта (Участник & Задача) в одной транзакции. Поскольку нет указателей, вы всегда будете получать согласованные результаты.

Смежные вопросы