Загрузить список предметов в объекте
У меня есть сущности 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);