începător medie de explicație a domeniului specific mongodb care este diferența dintre a face mapreduce sau de grup

În postul de referință, mi-am găsit răspunsul, dar sunt un începător pentru MongoDB, iar documentația lor nu este exact explicată pentru începător. De asemenea, citesc cartea lui Kristina, așa că îmi fac temele. M-am gândit că acest post ar putea ajuta alte utilizări care încearcă să-și dea seama și ele, mai degrabă decât cele tradiționale, am o problemă, cineva postează un eșantion de cod și niciodată nu înțeleg ce sa întâmplat.

Acestea fiind spuse, am un timp foarte greu, cu cateva lucruri interdependente pe care le-am enumerat mai jos, am gasit o alta intrebare buna si raspunsul cu privire la aceasta problema, dar a fost doar un cod si nu a fost bine explicat pentru un incepator la mongo. De asemenea, codul nu a funcționat pentru mine (http://stackoverflow.com/questions/6414312/fastest-way-to-get-the-average-of-a-specific-field-in-mongodb). : /

Am câteva documente cum ar fi:

{ "_id" : ObjectId("4fc7e9138c8b0f0d5200000f"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 464, "time" : 1338501393 }
{ "_id" : ObjectId("4fc7e9518c8b0f0d52000015"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 464, "time" : 1338501455 }
{ "_id" : ObjectId("4fc7e98f8c8b0f0d5200001b"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 463, "time" : 1338501517 }
{ "_id" : ObjectId("4fc7e9cd8c8b0f0d52000021"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 464, "time" : 1338501579 }
{ "_id" : ObjectId("4fc7ea0b8c8b0f0d52000027"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 446, "time" : 1338501641 }
{ "_id" : ObjectId("4fc7ea498c8b0f0d5200002d"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 424, "time" : 1338501703 }

Încerc să obțin toate elementele memfree și apoi să calculez media. Am incercat sa copiez/pasteam programarea codului bazat pe link-ul mentionat mai sus, in primul rand a facut sens pana la un punct, iar in al doilea rand nu functiona.

linia 2) prima linie are sens, destul de auto-explicativă linia 3) numărul de linii a doua: 0, total: 0 - sunt acești switch-uri adevărate/false? linia 4) este aceasta chemând aceeași reducere de la funcția mapReduce ()? Sunt cuvinte cheie doc sau out sau le definim în mod arbitrar? altele) codul a eșuat oricum, de ce?

Ultima sub-întrebare: Pot să fac același lucru folosind mapReduce și de ce aș folosi o funcție MapReduce versus un grup pe aceasta, dacă am fragmente trebuie să calculez și media de la fel?

0

1 răspunsuri

Acest lucru este acoperit în cea mai mare parte din documentația funcției de grup .

Să-l distrugem:

db.test.group(
- Run this query on test collection and group results.
{ cond: {"status": 1}
- I only care about documents which satisfy this condition, so filter my results.
, initial: {count: 0, total:0}
- I'm going to track two variables, count and total, let's initialize them to zero in the output document.
, reduce: function(doc, out){ out.count++; out.total += doc.views }
- For every document that satisfied the condition, apply this function (which will increment the count by one and increment the total by number of views in our document 'out'
, finalize: function(out){ out.avg = out.total/out.count }
- When we've gone through all the documents, run this function which will compute average views by dividing total views by number of documents and put that in my 'out' document.
} );

Există, de asemenea, o altă linie care nu a trebuit să fie inclusă în exemplul menționat, care ar fi necesar dacă doriți să grupați după câmpuri specifice. Fără aceasta, veți obține media pentru întreaga colecție. Cu aceasta, veți obține o valoare separată pentru fiecare valoare distinctă a "cheie".

Și da, reduce este aceeași funcție pe care o puteți scrie în hartă/reduce. Limitarea "grupului" constă în faptul că obțineți doar "documentul" care corespunde condiției dvs. În reducerea hărții puteți utiliza funcția "hartă" pentru a emite un document arbitrar bazat pe documentul de intrare.

Motivul pentru care am întrebat despre versiunea pe care o utilizați este Cadrul de agregare care este disponibil acum în versiunea de dezvoltare (2.1) și va fi lansată în versiunea 2.2 pentru producție simplifică foarte mult efectuarea de interogări agregate pe colecțiile MongoDB.

Sperăm că acest lucru a ajutat puțin.

0
adăugat