2013-03-27 17 views
20

Mam kolekcję błędów, więc każdy błąd zawiera pole date. Jak mogę agregować/liczyć/grupować błędy tylko do DAY (tj. Nie wliczając pory dnia)? Sądzę, że powinna być zastosowana pewna inteligentna projekcja.Jak agregować według daty, kiedy pełny znacznik czasu jest podany w strukturze agregacji?

+3

na przyszłość jest impportant zdefiniować różnicę między znacznikami czasu i daty, znaczniki czasu nie może być używany tylko z aktualnych funkcji pola daty. To tylko uwaga, ponieważ Anglicy mnie odtrącili. – Sammaye

+0

@Sammaye: dzięki, pytanie zostało naprawione. – BreakPhreak

Odpowiedz

42

Można to zrobić za pomocą następujących operatorów agregacji:

Daje to liczbę błędów na każdy dzień:

db.errors.aggregate(
    { $group : { 
     _id: { 
      year : { $year : "$date" },   
      month : { $month : "$date" },   
      day : { $dayOfMonth : "$date" }, 
     }, 
     count: { $sum: 1 } 
    }} 
); 

W tym przykładzie przyjęto, że pole daty w dokumentach błędów to date i typu BSON Date. Istnieje również rodzaj znacznika czasu w MongoDB, ale stosowanie tego typu jest jawnie zniechęca the documentation:

Uwaga: Typ BSON Znacznik czasu jest dla użytku wewnętrznego MongoDB. W przypadku większości przypadków podczas opracowywania aplikacji będziesz chciał użyć daty BSON o numerze . Zobacz datę, aby uzyskać więcej informacji.

+0

Jeszcze chwilkę - gdzie jest "_id"? Czy to musi być lub (najprawdopodobniej) coś tu brakuje? – BreakPhreak

+0

Naprawiono @BreakPhreak (myślę - znowu, nie mogę tego teraz przetestować) – Philipp

+3

PS: jako sidenote, dalej może być '$ sort" -ed przez '_id' (również testowane). – BreakPhreak

2

można zamienić pola datownika do łańcucha z konkretnego formatu daty za pomocą $project (aggregation)

aggregate([ 
    { 
     '$project': { 
      newFieldName: {'$dateToString': {format: '%Y-%m-%d', date: '$yourDateFieldName'}} 
     } 
    }, { 
     '$group': { 
      _id: {newFieldName: '$newFieldName'}, 
      viewCount: {'$sum': 1} 
     } 
    }, 
    {'$sort': {'_id.newFieldName': 1}} 
], {}) 
Powiązane problemy