2014-03-05 1 views
2

я использую MongoDB (я новичок в MongoDB) для хранения данных о моем потреблении электроэнергии, каждую минуту появляется новая запись, вот пример:Найти последнюю запись каждого дня

{"id":"5309d4cae4b0fbd904cc00e1","adco":"O","hchc":7267599,"hchp":10805900,"hhphc":"g","ptec":"c","iinst":13,"papp":3010,"imax":58,"optarif":"s","isousc":60,"motdetat":"Á","date":1393156826114} 

так что я имеют около 1440 записей в день.

Я хочу рассчитать стоимость за день, но проблема заключается в том, что мне нужна последняя запись дня, потому что эта запись может дать мне количество абсолютных кВтч (киловатт-час). Поэтому, если я удалю сумму kwh последней записи вчерашнего дня, у меня есть количество кВтч за день.

Поле hchp дает мне этот абсолютный кВтч. Поле date соответствует времени измерения в миллисекундах.

Потребление дня = абсолютное потребление в конце дня - абсолютное потребление в конце вчерашнего дня.

Как можно получить последнюю запись каждого дня в mongodb?

Примечание: Я использую MongoDB весной Java, поэтому мне нужен запрос, как это:

Пример, чтобы получить все необходимые меры:

@Query("{ 'date' : { $gt : ?0 }}") 
public List<Mesure> findByDateGreaterThan(Date date, Sort sort); 
+0

Вы посмотрели на диапазон, представляющий дату, а затем, сортируя и ограничивая наивысшее значение даты? – WiredPrairie

ответ

2

Не совсем уверен, что вы собираетесь здесь, но вы могли бы сделайте это в совокупности, если мое понимание будет правильным. Таким образом, чтобы получить последнюю запись для каждого дня:

db.collection.aggregate([ 

    // Date math converts to whole day 
    {"$project": { 
     "adco": 1, 
     "hchc": 1, 
     "hchp": 1, 
     "hhphc": 1, 
     "ptec": 1, 
     "iinst": 1, 
     "papp": 1, 
     "imax": 1, 
     "optarif": 1, 
     "isousc": 1, 
     "motdetat": 1, 
     "date": 1, 
     "wholeDay": {"$subtract": ["$date",{"$mod": ["$date",86400000]}]} 
    }}, 

    // Group on wholeDay (_id insertion is monotonic) 
    {"$group": 
     "_id": "$wholeDay", 
     "docId": {"$last": "$_id" }, 
     "adco": {"$last": "$adco" }, 
     "hchc": {"$last": "$hchc" }, 
     "hchp": {"$last": "$hchp" }, 
     "hhphc": {"$last": "$hhphc" }, 
     "ptec": {"$last": "$ptec" }, 
     "iinst": {"$last": "$iinst" }, 
     "papp": {"$last": "$papp" }, 
     "imax": {"$last": "$imax" }, 
     "optarif": {"$last": "$optarif", 
     "isousc": {"$last": "$isouc" }, 
     "motdetat": {"$last": "$motdetat" }, 
     "date": {"$last": "$date" }, 
    }} 
]) 

Так принцип здесь является то, что, учитывая значение временной метки, сделайте дату математику проекта, что как раз в полночь в начале каждого дня. Затем, когда ключ _id на документе уже монотонен (всегда увеличивается), тогда просто группируйте значение wholeDay, вытягивая документ $last с границы группировки.

Если вам не нужны все поля, то проектировать и группировать только те, которые вы хотите.

И да, вы можете сделать это в рамках весенних данных. Я уверен, что там есть завернутая команда. Но в противном случае, колдовство, чтобы добраться до родной команды идет что-то вроде этого:

mongoOps.getCollection("yourCollection").aggregate(...) 

Для записи, если вы на самом деле имели BSON типы даты, а не метку времени в виде числа, то вы можете пропустить дату математике:

db.collection.aggregate([ 
    { "$group": { 
     "_id": { 
      "year": { "$year": "$date" }, 
      "month": { "$month": "$date" }, 
      "day": { "$dayOfMonth": "$date" } 
     }, 
     "hchp": { "$last": "$hchp" } 
    }} 
]) 

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

  • Нет связанных вопросов^_^