1

Я использую хранилище Google App Engine (DataNucleus). У меня есть два класса: один чат и один рейтинг. Чат может быть оценен больше, чем один, поэтому я создал отношения «один-много», добавив список в класс «Чат».Приложение Datastore App Engine получает число детей от нескольких родителей

Теперь я хочу знать количество безрейтинговых чатов, так что я сделал следующее:

int numberOfChatsInStock = 0; 
for(Chat chat : chats){ 
    if(chat.getRatings().size() == 0){ 
    numberOfChatsInStock++; 
    } 
} 

Это просто перебрать все чаты и проверяет, если количество оценок равно 0.

Этого решение работает хорошо, когда есть 10 чатов, но когда у меня 500+ чатов, скорость ужасная (15 секунд +).

Я думал, что метод size() быстрее. Так что я попытался Query.setFilter ("ratings.size() == 0"), но это дает мне следующую ошибку: неподдерживаемый метод при разборе выражение: InvokeExpression {. [ПервичноеВыражение {оценок}] размер()}

Есть ли способ увеличить скорость?

EDIT РЕАКЦИЯ ОТ DataNucleus ЭКСПЕРТ:

Это плагин Google, и они несут ответственность за него (и тот факт, что они не реализовали, что метод их проблема ... Я уверен, их хранилище данных предлагает способ получения размера коллекции). Их плагин использует DataNucleus 1.1, и в настоящее время мы разрабатываем 2.2, поэтому, как вы можете догадаться, у нас не так много времени для среды GAE/J.

Почему Google использует версию 1.1?

ответ

0

Вы должны сохранить рейтинг в модели чата. Затем вы можете запустить запрос, чтобы выбрать все чаты с 0 рейтингами.

+0

Я подумал об этом раньше, но подумал, что это не лучший способ решить проблему, потому что я должен постоянно держать счет в курсе. Во всяком случае, пока я буду работать с ним, спасибо. –

+0

Когда вы разрабатываете для больших таблиц GAE (или многих других баз данных nosql), вам часто нужно денормализовать и прекомпрестировать, если вам нужны эффективные запросы. В противном случае вам придется перебирать множество данных, что может быть или не быть приемлемым. –

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