Загрузить список предметов в объекте

У меня есть сущности Question, Like и Hashtag. Также существует отношение один ко многим между объектами "Мне нравится" и "Вопрос". Я использую конечные точки облака Google, и моя проблема начинается здесь. В моем методе списка я возвращаю 20 вопросов как json. Но для каждого объекта вопроса в запросе я должен проверить, понравился ли пользователю вопрос, а также получить связанные с ним хэштеги. Как я могу сделать ту же операцию по ключу только пакетный запрос. В противном случае я делаю

ofy().load().type(Like.class)
                .filter("questionRef =", questionKey)
                .filter("accountRef =", accountKey).first().now();

для каждого объекта.

Как сущность

@Entity
@Cache
public class Like {

  @Id
  @Getter
  protected Long id;

  @Index
  @Load
  @ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
  private Ref<Account> accountRef;

  @Index
  @Load
  @ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
  private Ref<Question> questionRef;

  @Index
  @Getter
  protected Date createdAt;

  Like() {
  }

  Like(Key<Account> accountKey) {
    this.accountRef = Ref.create(accountKey);
    this.createdAt = new Date();
  }
}

Хэштег

@Entity
@Cache
public class Hashtag implements Model<Hashtag> {

  @Id
  @Getter
  @ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
  private Long id;

  @Index
  @Load
  @ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
  private Ref<Question> questionRef;

  @Index
  @Getter
  @Setter
  private String text;

  private Hashtag() {
  }

  private Hashtag(Builder builder) {
    this.questionRef = builder.questionRef;
    this.text = builder.text;
  }
}

2 ответа

Решение

Есть несколько частей к этому вопросу.

Во-первых, хэштеги: просто сохраните хэштеги в Вопросе как свойство индексированного списка. Легко.

Во-вторых, лайки: есть пара способов сделать это эффективно.

Одним из них является создание объекта Like с естественным ключом "account:question" (используйте строковый ключ websafe). Таким образом, вы можете выполнить пакетное получение по ключу для всех кортежей {user,question}. Некоторые будут отсутствовать, некоторые будут присутствовать. Разумно эффективно, если вас интересует только 20 вопросов, особенно если вы @Cache подобное, аналогичное, похожее.

Другой способ - создать отдельный объект индекса отношений, который отслеживает все симпатии пользователя и просто загружает их каждый раз. Вы можете поместить 5 тыс. Элементов в любое свойство списка, что означает, что вам нужно будет манипулировать несколькими объектами, когда пользователю нравится более 5 тыс. Элементов. Но их легко загрузить одним запросом предка. RIE нужно будет @Parentпод редакцией пользователя.

На отдельном примечании - не называйте поля thingRef, Это просто thing, Данные в базе данных являются лишь ключом. Вы можете поменяться Ref<?>, Key<?>и родной низкоуровневый Key, Информация о типе не принадлежит именам баз данных.

Я не уверен, что вы можете изменить структуру своих организаций. Если ответ "нет", то нет другого выбора, кроме выбранного вами.

Если да, я бы предложил структурировать Question включить Like а также Hashtag информация также.

@Entity
public class Question {
    @Id
    private long id;
    private Set<Key<Account>> likedBy;
    private List<String> hashtags;
}

По вопросу вы можете получить всю информацию за один запрос. Затем соберите все Account ключи и сделайте еще один запрос к хранилищу данных, чтобы получить всех людей, которым понравился вопрос, используя ключи, как показано ниже:

Map<Key<Account>, Account> likedByAccounts = ofy().load().keys(accountKeys);
Другие вопросы по тегам