Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: MongoDB grupowanie po

Czesc,

czy ma ktos dowiadczenie z grupowaniem po dacie w mongodb?

Mam kolekcje dokumentow Item, z polem status i createdDate, chcialbym pogrupowac po pewnym statusie, w pewnych odcinkach czasu (dzien). O ile znalezienie odpowiednich wartosci nie jest trudne, pogrupowanie wydaje sie skomplikowane, o tyle, ze jest group(), $group, map/reduce, nie bardzo wiem ktory wybrac (albo po co sa az 3).

Jakies sugestie?

Thx,
Piotr

konto usunięte

Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: MongoDB grupowanie po

Standardowo jestes mega pomocny...

konto usunięte

Temat: MongoDB grupowanie po

Piotr J.:
Standardowo jestes mega pomocny...

Standardowo oceniasz innych nieproszony... Anyway, masz mnie już z głowy ;) Plonk ;)
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: MongoDB grupowanie po

Trolowanie trolowaniem, a pytanie wciąż aktualne.
Albert D.

Albert D. Software Developer

Temat: MongoDB grupowanie po

Tutaj mozna poczytac o roznicach.
http://docs.mongodb.org/manual/reference/aggregation-c...

Ja sie troche ostatnio bawilem grupowaniem za pomoca aggregate() i $group ale nie z datami
i w tej chwili nie za bardzo wiem w czym moglby byc problem - chyba grupowac mozna normalnie jak wszystko inne :)Ten post został edytowany przez Autora dnia 30.08.13 o godzinie 17:14
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: MongoDB grupowanie po

Ok, zobacze, poprostu nie jest to super intuicyjne, sadzielem, ze ktos poprostu to juz robil. Dzieki.
Albert D.

Albert D. Software Developer

Temat: MongoDB grupowanie po

Grupowanie w MongoDB rzeczywiscie nie jest intuicyjne. Jakbys mial problem i chcial skorzystac z wersji $group to wrzuc przyklad danych i co chcesz osiagnac to pewnie ktos pomoze, albo pisz na priv.
Z map-reduce nie mam doswiadczenia, wiec gdybys ta droge wybral to nie pomoge :)Ten post został edytowany przez Autora dnia 30.08.13 o godzinie 19:18
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: MongoDB grupowanie po

Dzieki, mozna zawsze dojsc do jakichs doswiadczen wspolnie.

Moje dane to w zasadzie kolkcja Item:

1) ID
2) data utworzenia
3) status (queued, completed, submitted)

Interesuje mnie stworzenie wykresu wstecz, ktory pokaze, ile jest kadego ze statusu, per dzien, tydzien,miesiac (pewnie 3 zapytania, ale nalozone na 1 wykres, ale to juz wybiega poza pytanie).

Nie planuje shardowanej kolekcji, raczej replica set 3 maszyn.

konto usunięte

Temat: MongoDB grupowanie po

A MongoDB jestem zielony, ale spróbuj coś takiego (nie mam na czym przetestować):


db.item.save({ "id": 1, "data": 20130823, "status": 1});
db.item.save({ "id": 1, "data": 20130723, "status": 2});
db.item.save({ "id": 1, "data": 20130723, "status": 1});
db.item.save({ "id": 2, "data": 20130624, "status": 3});
db.item.save({ "id": 2, "data": 20130524, "status": 1});
db.item.save({ "id": 3, "data": 20130424, "status": 2});
db.item.save({ "id": 4, "data": 20130424, "status": 3});

db.runCommand( { group:
{
ns: 'item',
key: { 'data': 1, 'status': 1 },
$reduce: function ( curr, result ) {
result.total += 1;
},
initial: { total : 0 }
}
} )


Na podstawie:
http://docs.mongodb.org/manual/reference/command/group/Ten post został edytowany przez Autora dnia 01.09.13 o godzinie 19:34
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: MongoDB grupowanie po

Dzieki, ale to jedynie powie, ze masz 7 wpisow ;-)
Albert D.

Albert D. Software Developer

Temat: MongoDB grupowanie po

W jakim formacie przechowujesz date - string czy ISODate?

W przykladach uzywam shella MongoDB.
db.test.insert({"status":"queued","created_at": new Date()})
db.test.insert({"status":"queued","created_at": new Date()})
db.test.insert({"status":"queued","created_at": new Date()})
db.test.insert({"status":"queued","created_at": new Date()})
db.test.insert({"status":"queued","created_at": new Date()})
db.test.insert({"status":"completed","created_at": new Date()})
db.test.insert({"status":"completed","created_at": new Date()})
db.test.insert({"status":"completed","created_at": new Date()})
db.test.insert({"status":"submitted","created_at": new Date()})
db.test.insert({"status":"submitted","created_at": new Date()})
db.test.insert({"status":"submitted","created_at": new Date()})

Jesli jest to ISODate (tak jak w moim przykladzie) to sprawa wydaje sie byc latwiejsza, bo agregacja po:

- dzien (niestety roku)
db.test.aggregate([{$group:{_id:{"status":"$status","year":{$year":"$created_at"},"created_at":{$dayOfYear:"$created_at"}},"rows":{$sum:1}}}])

- tydzien (w roku)
db.test.aggregate([{$group:{_id:{"status":"$status","year":{$year":"$created_at"},"created_at":{$week:"$created_at"}},"rows":{$sum:1}}}])

- miesiac
db.test.aggregate([{$group:{_id:{"status":"$status","year":{$year":"$created_at"},"created_at":{$month:"$created_at"}},"rows":{$sum:1}}}])Ten post został edytowany przez Autora dnia 02.09.13 o godzinie 12:41
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: MongoDB grupowanie po

Czesc,

dzieki wielkie, zdaje sie, jest zwykly Date.

Wykombinowalem to samo map-reduce:


db.Item.mapReduce(
function(){
var day = Date.UTC(this.createdDate.getFullYear(), this.createdDate.getMonth(), this.createdDate.getDate());
emit({utc: day, status: this.status}, {count: 1});
},
function(key, values){
var count = 0;

values.forEach(function(v){
count += v['count'];
});
return { count: count };
},
{out: "pageview_results"}
)


ale ponoc aggregation framework jest niby lepszy pod wzgledem szybkosci dla mniejszych zbiorow (m/r jedzie na jednym watku na js), niemniej jednak zapewne po jakims czasie dokumenty wejda w grube miliony, wiec sharding mnie nie ominie.

Ten m/r wrzuca wszystko do nowej kolekcji no i nie jest niczym ograniczony, produkcyjne zaptaynie zapewne bedzie mialo ograniczenie czasu wstecz.

Przetestuje tez szybkosc Twoich zapytan wzgledem moich wynikow.


"result" : "pageview_results",
"timeMillis" : 359,
"counts" : {
"input" : 1316,
"emit" : 1316,
"reduce" : 33,
"output" : 39
}
Albert D.

Albert D. Software Developer

Temat: MongoDB grupowanie po

Jesli masz taka mozliwosc bo dysponujesz duzym zbiorem danych to jestem bardzo ciekaw wynikow. Ja nie mam takich mozliwosci.
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: MongoDB grupowanie po

Zbior jest jeszcze nieduzy, mialem kilkaset tysiecy dokumentow (teraz mam raptem tysiac), ale jak mongodb sie zapelnia to prawie niemozliwe jest zwolnienie miejsca na dysku, bo do kompaktowania potrzebuje sporo miejsce (jakos nikt nei wpadl na to, ze zeby zwolnic miejsce trzeba je miec mogloby byc problemem), jedna z rzeczy, ktore odroznia dojzalosc mongo od np mysql.

Dam znac jak uporam sie z Twoimi zapytaniami, bo szczerze mowiac mi nie dziala:/

konto usunięte

Temat: MongoDB grupowanie po

Piotr J.:
Dzieki, ale to jedynie powie, ze masz 7 wpisow ;-)

No aż zainstalowałem MongoDB (pierwszy raz) :-)

I... jak powiedział pewien lekarz-informatyk gdy rozmawiał z chorym na wątrobę:
"dziwne, u mnie działa"

Dodatkowych kilka rekordów (za mało było danych)


db.item.save({ "id": 11, "data": 20130823, "status": 1});
db.item.save({ "id": 12, "data": 20130823, "status": 1});
db.item.save({ "id": 14, "data": 20130424, "status": 3});


Ta sama komenda co wcześniej


db.runCommand( { group:
{
ns: 'item',
key: { 'data': 1, 'status': 1 },
$reduce: function ( curr, result ) {
result.total += 1;
},
initial: { total : 0 }
}
} )


Wynik: (patrz pierwszy i ostatni total)


{
"retval" : [
{
"data" : 20130823,
"status" : 1,
"total" : 3
},
{
"data" : 20130723,
"status" : 2,
"total" : 1
},
{
"data" : 20130723,
"status" : 1,
"total" : 1
},
{
"data" : 20130624,
"status" : 3,
"total" : 1
},
{
"data" : 20130524,
"status" : 1,
"total" : 1
},
{
"data" : 20130424,
"status" : 2,
"total" : 1
},
{
"data" : 20130424,
"status" : 3,
"total" : 2
}
],
"count" : 10,
"keys" : 7,
"ok" : 1
}
Ten post został edytowany przez Autora dnia 02.09.13 o godzinie 21:30
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: MongoDB grupowanie po

True, zasugerowalem sie roznica danych u mnie. Kombinuje teraz z tym aggregate() bo jednak m/r jest troche wolny.

Następna dyskusja:

Grupowanie według miesiąca




Wyślij zaproszenie do