2015-07-01 4 views
1

У меня есть MongoDB, который хранит простой Pojo с морфием:MongoDB группы в день с морфием

@Entity 
private static class Task{ 
    @Id 
    private ObjectId id; 
    private Date timestamp; 
    private int task; 
} 

То, что я хочу сделать, это получить общее количество заданий на каждый день. Я столкнулся с проблемой обработки даты, чтобы они были проектами на день (01-07-2015 00: 00: 00: 00) вместо полной даты с секундами и милисекундами.

Возможные решения:

  1. За каждый день я должен сделать отдельный агрегацию, который я предпочел бы не делать.
  2. Из этого link я пришел с идеей, имеющей функцию, как

    (timestamp.toMilliseconds()/(1000 * 60 * 60 * 24) * (1000 * 60 * 60 * 24)). Todate()

так, что дни будут округлены, но я не знаю, как сделать это с морфием и Явы. Я совершенно новичок в этом и все еще ищу способ сделать операции с датой, но очень мало полезного учебника онлайн.

  1. Запрограммируйте временную метку на 3 столбца года, месяца и дня, а затем выполните некоторую группировку. Но идея иметь 3 колонки всего за день для меня не очень приятна.

Пожалуйста, помогите, большое вам спасибо!

ответ

1

Ну, наконец, я могу узнать что-то, речь идет о втором методе. Поскольку mongo не поддерживает операцию типа timestamp.toMilliseconds(), мне нужно получить каждый компонент даты и рассчитать их в миллисекундах точно так же, как упомянутый link.

Projection ms = expression("$millisecond", projection("timestamp")); 
    Projection secToMs = multiply(expression("$second", projection("timestamp")), SEC_TO_MS); 
    Projection minToMs = multiply(expression("$minute", projection("timestamp")), MIN_TO_MS); 
    Projection hourToMs = multiply(expression("$hour", projection("timestamp")), H_TO_MS); 
    Projection sum = add(ms, secToMs, minToMs, hourToMs); 
    Projection dayRounded = subtract(projection("timestamp"), sum); 

И потом, что я уехал, чтобы сделать, это просто

datastore.createAggregation(Task.class).project(projection("timestamp",dayRounded)).aggregate(OutputClass.Class); 

Надежда, что будет полезно для кого-то. Если кто-нибудь найдет лучшее решение, скажите, пожалуйста.

1

Я бы порекомендовал создать новое поле: int daycode, которое вы заполняете как 20150701 при установке поля timestamp в прикладном уровне. Тогда вы можете делать агрегацию без каких-либо вычислений. Кроме того, вы можете поместить индекс в это поле daycode, а позже у вас есть возможность очертить коллекцию в этом поле.

В мире документов-баз данных вы хотите избежать «на лету» расчетов любой ценой и предварительно рассчитать как можно больше. Он может выглядеть излишним, но вы сохраните циклы CPU в долгосрочной перспективе.

+0

Я сделал несколько последних тестов, и запрос на самом деле не занимал слишком много времени, поэтому я думаю, что сейчас все в порядке. Но, безусловно, ваша идея имеет смысл, и я буду считать это, большое спасибо за ваш вклад :) – Aliencc