From 8541b38f2b6420b9f0847a391bafb598abc53ab8 Mon Sep 17 00:00:00 2001 From: "Scott R. Parish" Date: Mon, 8 Mar 2010 22:54:23 -0600 Subject: [PATCH] fix map-reduce-example formatting --- map-reduce-example.md | 122 ++++++++++++++++++++++++------------------ 1 file changed, 71 insertions(+), 51 deletions(-) diff --git a/map-reduce-example.md b/map-reduce-example.md index 68c9efb..96550dd 100644 --- a/map-reduce-example.md +++ b/map-reduce-example.md @@ -10,33 +10,33 @@ This document has been shamelessly ported from the similar Setup ----- -To start, we’ll insert some example data which we can perform +To start, we'll insert some example data which we can perform map/reduce queries on: -> $ ghci -package mongoDB -> GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help -> ... -> Prelude> :set prompt "> " -> > import Database.MongoDB -> > import Database.MongoDB.BSON -> > import Data.ByteString.Lazy.UTF8 -> > c <- connect "localhost" [] -> > let col = (fromString "test.mr1") -> > :{ -> insertMany c col [ -> (toBsonDoc [("x", BsonInt32 1), -> ("tags", BsonArray [toBson "dog", -> toBson "cat"])]), -> (toBsonDoc [("x", BsonInt32 2), -> ("tags", BsonArray [toBson "cat"])]), -> (toBsonDoc [("x", BsonInt32 3), -> ("tags", BsonArray [toBson "mouse", -> toBson "cat", -> toBson "doc"])]), -> (toBsonDoc [("x", BsonInt32 4), -> ("tags", BsonArray [])]) -> ] -> :} + $ ghci -package mongoDB + GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help + ... + Prelude> :set prompt "> " + > import Database.MongoDB + > import Database.MongoDB.BSON + > import Data.ByteString.Lazy.UTF8 + > c <- connect "localhost" [] + > let col = (fromString "test.mr1") + > :{ + insertMany c col [ + (toBsonDoc [("x", BsonInt32 1), + ("tags", BsonArray [toBson "dog", + toBson "cat"])]), + (toBsonDoc [("x", BsonInt32 2), + ("tags", BsonArray [toBson "cat"])]), + (toBsonDoc [("x", BsonInt32 3), + ("tags", BsonArray [toBson "mouse", + toBson "cat", + toBson "doc"])]), + (toBsonDoc [("x", BsonInt32 4), + ("tags", BsonArray [])]) + ] + :} Basic Map/Reduce ---------------- @@ -49,36 +49,43 @@ tags array, across the entire collection. Our map function just emits a single (key, 1) pair for each tag in the array: -> > :{ -> let mapFn = " -> function() {\n -> this.tags.forEach(function(z) {\n -> emit(z, 1);\n -> });\n -> }" -> :} + > :{ + let mapFn = " + function() {\n + this.tags.forEach(function(z) {\n + emit(z, 1);\n + });\n + }" + :} The reduce function sums over all of the emitted values for a given key: -> > :{ -> let reduceFn = " -> function (key, values) {\n -> var total = 0;\n -> for (var i = 0; i < values.length; i++) {\n -> total += values[i];\n -> }\n -> return total;\n -> }" -> :} + > :{ + let reduceFn = " + function (key, values) {\n + var total = 0;\n + for (var i = 0; i < values.length; i++) {\n + total += values[i];\n + }\n + return total;\n + }" + :} -Note: We can’t just return values.length as the reduce function might +Note: We can't just return values.length as the reduce function might be called iteratively on the results of other reduce steps. Finally, we call map_reduce() and iterate over the result collection: -> > mapReduce c col (fromString mapFn) (fromString reduceFn) [] >>= allDocs -> [[(Chunk "_id" Empty,BsonString (Chunk "cat" Empty)),(Chunk "value" Empty,BsonDouble 6.0)],[(Chunk "_id" Empty,BsonString (Chunk "doc" Empty)),(Chunk "value" Empty,BsonDouble 1.0)],[(Chunk "_id" Empty,BsonString (Chunk "dog" Empty)),(Chunk "value" Empty,BsonDouble 3.0)],[(Chunk "_id" Empty,BsonString (Chunk "mouse" Empty)),(Chunk "value" Empty,BsonDouble 2.0)]] + > mapReduce c col (fromString mapFn) (fromString reduceFn) [] >>= allDocs + [[(Chunk "_id" Empty,BsonString (Chunk "cat" Empty)), + (Chunk "value" Empty,BsonDouble 6.0)], + [(Chunk "_id" Empty,BsonString (Chunk "doc" Empty)), + (Chunk "value" Empty,BsonDouble 1.0)], + [(Chunk "_id" Empty,BsonString (Chunk "dog" Empty)), + (Chunk "value" Empty,BsonDouble 3.0)], + [(Chunk "_id" Empty,BsonString (Chunk "mouse" Empty)), + (Chunk "value" Empty,BsonDouble 2.0)]] Advanced Map/Reduce ------------------- @@ -86,11 +93,24 @@ Advanced Map/Reduce MongoDB returns additional information in the map/reduce results. To obtain them, use *runMapReduce*: -> > res <- runMapReduce c col (fromString mapFn) (fromString reduceFn) [] -> > res -> [(Chunk "result" Empty,BsonString (Chunk "tmp.mr.mapreduce_1268105512_18" Empty)),(Chunk "timeMillis" Empty,BsonInt32 90),(Chunk "counts" Empty,BsonDoc [(Chunk "input" Empty,BsonInt64 8),(Chunk "emit" Empty,BsonInt64 12),(Chunk "output" Empty,BsonInt64 4)]),(Chunk "ok" Empty,BsonDouble 1.0)] + > res <- runMapReduce c col (fromString mapFn) (fromString reduceFn) [] + > res + [(Chunk "result" Empty, BsonString (Chunk "tmp.mr.mapreduce_1268105512_18" Empty)), + (Chunk "timeMillis" Empty, BsonInt32 90), + (Chunk "counts" Empty, + BsonDoc [(Chunk "input" Empty,BsonInt64 8), + (Chunk "emit" Empty,BsonInt64 12), + (Chunk "output" Empty,BsonInt64 4)]), + (Chunk "ok" Empty,BsonDouble 1.0)] You can then obtain the results using *mapReduceResults*: -> > mapReduceResults c (fromString "test") res >>= allDocs -> [[(Chunk "_id" Empty,BsonString (Chunk "cat" Empty)),(Chunk "value" Empty,BsonDouble 6.0)],[(Chunk "_id" Empty,BsonString (Chunk "doc" Empty)),(Chunk "value" Empty,BsonDouble 1.0)],[(Chunk "_id" Empty,BsonString (Chunk "dog" Empty)),(Chunk "value" Empty,BsonDouble 3.0)],[(Chunk "_id" Empty,BsonString (Chunk "mouse" Empty)),(Chunk "value" Empty,BsonDouble 2.0)]] + > mapReduceResults c (fromString "test") res >>= allDocs + [[(Chunk "_id" Empty,BsonString (Chunk "cat" Empty)), + (Chunk "value" Empty,BsonDouble 6.0)], + [(Chunk "_id" Empty,BsonString (Chunk "doc" Empty)), + (Chunk "value" Empty,BsonDouble 1.0)], + [(Chunk "_id" Empty,BsonString (Chunk "dog" Empty)), + (Chunk "value" Empty,BsonDouble 3.0)], + [(Chunk "_id" Empty,BsonString (Chunk "mouse" Empty)), + (Chunk "value" Empty,BsonDouble 2.0)]]