You are on page 1of 8

The MongoDB Solution for Big Data

VS MONGODB AT SCALE

TokuMX™ is an open source, high-performance has


and

20x
90%
70%

solution or to ™
,
u
s
www.Tokutek.com or email us:
contact@tokutek.co
B r o u g H t t o Yo u B Y:

17
1
» Configuration Options
CONTENTS
MongoDB
» Using the Shell
» Diagnosing What’s Happening
» Quick Rules
» Query Operators
By Vlad Mihalcea
» And more...
Get More Refcardz! Visit

MongoDB is a document-oriented database that is sEEing options


Refcardz.com

easy to use from almost any language. As of August If you started mongod with a bunch of options six
2014, MongoDB is by far the m o st p opu lar NoSQL months ago, how can you see which options you
d a tabas e a cco rd i n g to http://db-engines.co m/e n / used? The shell has a helper:
ranking. This R efcard is inte n d e d to h elp yo u g e t t h e
m o st o u t of MongoDB a n d a ss u m e s th at yo u alre a d y > db.serverCmdL ineOpts()
k n ow the basics If you’re just starting out, try t h e s e { “ a r g v ” : [ “. I mo ng o d”, “ - - p or t ”, “30 0 0 0” ] , “ pa r s e d” :
{ }, “ o k” : 1 }
re so u rces:
• For installation notes, see http://docs.mongodb. The parsed field is a list of arguments read from a
org/manual/installation/ config file.

• For a quick tutorial on basic operations, see


http ://d ocs. mon go db.org/manu al/tuto ri al / usi n g tH E sHE L L
g e tt i n g -st arte d /
sHELL HELp
T h ere a re a n u m b e r of functions that give yo u a little
Configuration options help if yo u fo rg et a co m m a n d :
sEtting options > II basic help
> help
S tartup option s fo r MongoDB can be set on t h e d b. h e l p( ) h el p on db me t h o d s
d b. myc ol l . h el p( ) h e l p on c ol l e c t i o n
co m m a n d line or in a configuration file. T he syntax is me t h o d s s h. h el p( ) s ha r d i n g h e l p e r s
slightly different betw een the tw o . H e re are the thre e r s . h el p( )
h e l p e r s h el p a d mi n
r e pl i c a s e t

t y p e s of options: a d mi ni s t r a t i ve h e l p
hel p c onne c t c o n ne c t i ng t o a db
hel p
Co mma n d - Li n E Co n f ig f iLE ...
--d bpat h /path/to/db dbpath=/path/to/db Note that there are separate help functions for
databases, collections, replica sets, sharding,
--auth auth=true
administration, and more. Although not listed
-vvv vvv=true explicitly, there is also help for cursors:
Run mongod --help for a full list of options. Here are > II list common cursor functions
> db.foo.find().help()
some of the most useful:

o p t io n d E s Cr i p t io n You can use these functions and helpers as built-in


cheat sheet s.
Specifies c onfig file w h e re o t h e r
--config / p a t h / t o / c o n f i g
options are set. Seeing Function Definitions
--dbpath /path/to/data P a th to d a ta dire c tory. If you don’t understand what a function is doing, you
- - p o r t 27017 Port for MongoD B to listen on.

Where the log is stored. This is


--logpath /path/to/file.log a p a t h t o t h e e xa c t file, n o t a
directory.

On restart, appends to (does not

--logappend
t runc at e) t h e e xisting log file.
Always use this when using the
--logpath option.

--fork
Forks t h e m o n g o d a s a d a e m o n
process.

--auth
E na bl e s authenti ca tion o n a single
server.
mo n g o d B

Enables authentication on replica


- - k e y F i l e / p a t h / t o / k e y. t x t sets a n d s ha rdi ng. Take s a p a th to a
s h a re d s e c re t key
--nohttpinterface Turns off HTTP interfa c e .

--bind_ip address
Onl y allow s connections fro m t h e
specified network interface.

© DZo n e, I n c . | DZo n e . c o m
2 Mongodb

can run it without the parentheses in the shell to see its • DBCollection.prototype.reIndex
source code:
• DBCollection.prototype.dropIndexes
> II run the function
> db.serverCmdLineOpts() CHanging tHE prompt
{ “argv” : [ “.Imongod” ], “parsed” : { }, “ok” : 1 }
> II see its source The shell prompt can be customized by setting the
> db.serverCmdLineOpts
prompt variable to a function that returns a string:
This can be helpful for seeing what arguments it expects prompt = function() {
or what errors it can throw, as well as how to run it try {
db.getLastError();
from another language. }
catch (e) {
print(e);
Using edit }
The shell has limited multi-line support, so it can be return (new Date())+”$ “;
}
difficult to program in. The shell helper edit makes this
easier, opening up a text editor and allowing you to edit
variables from there. For example: If you set prompt, it will be executed each time the
prompt is drawn (thus, the example above would give
> x = f u nc t i o n( ) { / * s o m e f u n c t i on w e ’ r e g o i n g t o f i l l i n * / } you the time the last operation completed).
> edit x
<opens emacs with the contents of x>
Try to include the d b.getLa stError() function call in your
p ro m p t . This is included in the d e fault p ro m p t a n d take s
Modify the variable in your editor, then save and exit. The c are of server reconnect ion an d returning errors fro m
variable will be set in the shell. writes.
Either the EDITOR environment variable or a MongoDB Also, always put any code that could throw an exception
shell variable EDITOR must be set to use edit. You can in a try/catch block. It’s annoying to have your prompt
set it in the MongoDB shell as follows: turn into an exception!
> EDITOR=”IusrIbinIemacs”

edit is not available from JavaScript scripts, only in the d i a g n o s i n g W Ha t ’s H a p p E n i n g


interactive shell.
viEWing and KiLLing opErations
.mongorc.js
You can see current operations with the currentOp
If a . mong orc.js file exists in yo u r h o m e dire c tory, it will
function:
a u to m atically b e run on shell start u p . Use it to initialize
any helper functions you use regularly an d re m ove > db.currentOp()
{
functions yo u d on ’t w an t to accidentally u se. “inprog” : [
{
For example, if you would prefer to not have “opid” : 123, “active” :
false, “locktype” :
dropDatabase() available by default, you could add the “write”, “waitingForLock”
following lines to your .mongorc.js file: : false, “secs_running” :
200,
“op” : “query”,
DB.prototype. dropDatabase = function() {
“ns” : “foo.bar”,
print(“No dropping DBs!”);
“query” : {
}
}
db.dropDatabase = DB.prototype.dropDatabase; ...
},
...
The example above will change the dropDatabase() ]
}
helper to only print a message, and not to drop
databases.
Using the opid field from above, you can kill operations:
N o te that this techn iq u e sh ould n o t b e used
> db.killOp(123)
fo r security b ecau s e a d e ter mi n e d u se r ca n still
drop a d a t a b a s e wi t h o u t the helper. Howe ver,
Not all operations can be killed or will be killed
re m ovin g d ang e ro u s ad min co m m a n d s can immediately. In general, operations that are waiting for a
help p reven t fa t-fingering. lock cannot be killed until they acquire the lock.
A couple of suggestions for helpers you may want to
indEx usagE
remove from .mongorc.js are:
• DB.prototype.shutdownServer Use explain() to see which index MongoDB is using for a
query.
• DBCollection.prototype.drop
• DBCollection.prototype.ensureIndex

© DZo n e, I n c . | DZo n e . c o m
3 Mongodb

> db.foo.find(criteria).explain() this function:


{
“cursor” : “BasicCursor”, > db.printReplicationStatus()
“isMultiKey” : false, c o nfig ur e d o plo g s i z e : 2000 MB
“n” : 2, “nscannedObjects” : log length start to end: 23091secs (6.4hrs)
2, “nscanned” : 2, o plo g fir s t e ve nt t i me: Fr i Aug 10 2012 04: 33: 03 GMT+0200
“nscannedObjectsAllPlans” : (CEST)
2, “nscannedAllPlans” : 2, o plo g l a s t e ve nt t i me: Mo n Aug 20 2012 10: 56: 51 GMT+0200
“scanAndOrder” : false, (CEST)
“indexOnly” : false, n o w: Mo n Aug 20 2012 10: 56: 51 GMT+0200
“ n Yi e l d s ” : 0 , (CEST)
“nChunkSkips” :
0, “millis” : 0,
“indexBounds” : { To see a member ’s view of the entire set, connect to it
}, and run:
“server” :
“ubuntu:27017” > rs.status()
}

This command will show you what it thinks the state and
There are several important fields in the output of
status of t he ot her members are.
explain():
•n: the number of results returned. Running rs.status() on a secondary will show you who
the secondary is syncing from in the (poorly named)
•nscanned: the number of index entries read. syncingTo field.

•nscannedObjects: the number of docs referred by sHarding


the index. To see your cluster ’s metadata (shards, databases,
•indexOnly: if the query never had to touch the chunks, etc.), run the following function:
collection itself. > db.printShardingStatus()
> db.printShardingStatus(true) II show all chunks
•nYields: the number of times this query has released
the read lock and waited for other operations to go. You can also connect to the mongos and see data about
your shards, databases, collections, or chunks by using
•indexBounds: when an index is used, this shows the
“use config” and then querying the relevant collections.
index scan ranges.
> us e co n fi g
t Yp E s o f C u r s o r s s wi t c h e d t o db c o n fig
> show collections
A BasicCursor means that no index was used. A chunks
databases
BtreeCursor means a normal index was used. Parallel lockpings
cursors are used by sharding and geospatial indexes use locks
mongos
their own special cursors. settings
shards
Hinting system.indexes
version
Use hint() to force a particular index to be used for a
query:
Always connect t o a mongos to get sharding
> db.foo.find().hint({x:1}) information. Never connect directly to a config server.
Never directly write to a config server. Always use
sYstEm profiLing sharding commands and helpers.
You can turn on system profiling to see o p e ra tions After maintenance, sometimes mongos processes
currently h app enin g o n a d a t a b as e . T here is a that were not actually performing the maintenance
p e rfo r m a n ce penalt y to profiling, but it can help will not have an updated version of the config.
isolat e slow queries. Either
bouncing these servers or running the
> db. setProfilingLevel(2) // profile all operations
> db. setProfilingLevel(1) // profile operations that take longer flushRouterConfig
> use admin
t han 1 00m s command is generally a quick fix to this issue.
> db.runCom mand({flushRouterConfi g:1})
> db.setProfilingLevel(1, 500) // profile operations that take
longer than 500ms
> db.setProfilingLevel(0) // turn off profiling
> db.getProfilingLevel(1) // see current profiling setting Often this problem will manifest as setShardVersion
failed errors.
Profile entries are stored in a capped collection called Don’t worry about setShardVersion errors in th e logs,
system.profile in the database in which profiling was b u t they should n o t trickle u p to yo u r application (yo u
enabled. Profiling can be turned on and off for each shouldn’t get the errors from a driver unless the m o n g o s
database. it’s connect i ng to c a n n o t reac h an y config servers).
rEpLiCa sEts
To find replication lag, connect to a secondary and run

© DZo n e, I n c . | DZo n e . c o m
4 Mongodb

mongo monitoring sErviCE (mms) QuErY format


MMS is a fre e , easily-setup w ay to monitor M o n g o D B . Queries are generally of the form:
To u se it, c re a te an a cc o u n t a t http ://m ms.10gen.co m.
{key : {$op : value}}

For example:
{age : {$gte : 18}}

There are three exceptions to this rule: $and, $or, and


$nor, which are all top-level:
{$ or : [ {a ge: {$ g te : 18}}, {a g e : {$l t : 18},
p a r e n t a l Co ns e n t : t r u e}}] }

updatE format
Updates are always of the form:
See http://mms.10gen.com/help for more {key : {$mod : value}}
d ocumentatio n.
For example:

QuiCK ruLEs {age : {$inc : 1}}

dataBasEs
Database names cannot contain “.”, “$”, or “\0” (the QuErY opErators :
null character). N a m e s can only contain characters t h a t :Matches
can be used on your filesystem as filenames. Admin, x: Does not mat ch
config, and local a re reser ved d atabase n a m e s (yo u c a n o p Er a t o r E x a m pLE Q u Er Y Ex a mp LE d o Cs
sto re yo u r o w n d ata in th em, b u t yo u should n ever d ro p
t hem). {numSold: 1}
$gt, $gte, $lt, $lte,
CoLLECtions $ne
{numSold : {$lt:3}} x {numSold: “hello”}
x {x : 1}
Collection names cannot contain “$” or “\0”. N am e s
prefixed with “system.” are reserved by MongoDB a n d {age: 21}
c a n n o t b e d ro p p e d (eve n if yo u c re ate d th e collection). $in, $nin {age : {$in : [10, 14, 21]}} {age:
D o t s are ofte n used fo r o rganization in collection names, [9 , 10, 11]}

b u t they h ave n o semanti c importan ce . A c ollection x {age: 9}


{hand: [“7”, “8”,
named “che.se” has no mo re relation to a collection { han d : {$all : “9”, “10”, “J”, “Q”,
$all
named “che” than one named “cheese” d oes. “K”, [“10”,”J”,”Q”,”K”,”A”]}} “A”]}
x {hand:[“J”,”Q”,”K”]}
fiELd namEs {name: “Jon”}
$not {name : {$not : /jon/i}}
Field n ame s canno t contain “.” nor “\0”. Fields should x {name: “John”}
only contain “$” w h e n they a re d atabase refe re n ces.  {age: 50}
$mod {age : {$mod : [10, 0]}}
indEx options x {a ge: 42}

Builds indexes in the background,


{phone: “555-555-
5555”}
b a c k g ro u n d while other connections can read $exists {phone : {$exists: true}}
and write. x {ph ones: [“555-

E very value for this key m u st b e 555-5555”, “1-800-


uni qu e 555-5555”]}
distinct.

Non-existent values are not $type* { a g e : {$ ty p e : 2}}


{age : “42”}
s p a rs e
indexed. Very handy for indexing x {age : 42}
unique fie lds that s ome docume nts
might not have. {“top-three”:[“gold
”,”silver”,”bronze”]}
Takes a number of seconds $size {“top-three”:{$size:3}} x {“to p - t h ree”:[“blue
expireAfterSeconds and makes this a “time to live”
collection. ribbon”]}

When creating unique indexes,


d ro p s duplic ate va lue s inste ad of
d ro p D u p s erroring out. N o te tha t this will
d
elete document s wi th dupli cate
v
alues!

© DZo n e, I n c . | DZo n e . c o m
5 Mongodb

W rite s th e a g g re ga tion result


{role: { $ o u t : o u t p u t - c o l l ec t io n }
{role: / admin.*/i} documents to a specified collection.
{role: {$regex:’admin.*’,
“administra to r ”}
$r ege x {role: “Admin”}
To refer to a field, use the syntax $fieldName. For
$options: ‘i’
example, this projection would return the existing “time”
}}
x {role: “user”} field with a new name, “time since epoch”:
See http://www.mongodb.org/display/DOCS/
{$project: {“time since epoch”: “$time”}}
Advanced+Queries for a full list of types.
$project and $group can both take expressions, which
can use this $fieldName syntax as shown below:
updatE modifiErs
Ex p r Es s i o n o p E x a mp LE d E s Cr i p t io n

mo d i f iEr s ta r t d o C E x a m pLE mo d En d d o C $a d d : [ “ $ a g e ” , 1 ] A d d s 1 to t h e a g e field.

$set {x:”foo”} {$set:{x:[1,2,3]}} {x:[1,2,3]} $divide : [“$sum”, “$count”] Divides the sum field by count.

$mod : [ “ $ s u m ” , “ $ c o u n t ” ]
T he remainde r of dividing s u m by
$unset {x:”foo”} {$unset:{x:true}} {}
count.
{$inc:{co u n td o wn:-
$inc {c o u n td o wn:5}
{countdown:4} $multiply : [“$mph”, 24, 365] Multiplies mp h by 24*365
1}}
$subtract : [“$price”,
$push, “$discount”] S u b t racts d isco u n t fro m price .
{votes:[-1,-1,1]} {$push:{votes:-1}} {votes:[-1,-1,1,-1}}
$pushAll
1 if n a m e is less t h a n ZZ, 0 if n a m e is
$strcasecm p : [“ZZ”, “$name”]
$pull, {blacklist::[“ip1”, {$pull:{blacklist: {blacklist:”ip1”, ZZ, -1 if name is greater than ZZ.
$pullAll ”ip2”, “ip3”]} “ip2”}} ”ip3”} G e t s th e a re a co d e (first t hre e
$ s u b s t r : [“$phone”, 0, 3]
{queue:[“1pm” ,” {queue:[“3pm”, characters) of phone.
$p o p
{$pop:{queue:-1}}
3pm”,”8pm”]} “8pm”]} $t oLow e r : “ $ s t r ” C o n verts str to all lowe rc a s e .

$a d d ToSe t, {$add ToSet:{ints:{$ $toUpper : “ $ s t r ” C o nvert s str to all u p p e rc a s e .


{ints:[0,1,3,4]} {ints:[0,1,2,3,4]}
$each $each:[1,2,3]}}}
$ifNull : [“$mightExist”, If mightExi st is n o t null, re tur ns
{$ rename:{n mae:
$re nam e {nmae: ”sam” } {name:”sam”} $a d d : [ “ $ d o e s E x i s t ” , 1 ] ] mightExi st. Otherwise returns t h e
”name”}} result of t he s e c o n d e xp re ssion.
{$bit:{permissions If exp1 evalutes to true, return exp2,
$bit {p e r mission:6 }
{permission:7} $ co n d : [ e x p 1 , e x p 2 , e x p 3 ]
:{or:1}}} ot herw is e return expr3.

$ l e t : { v a r s , in }
Bi nd s variables to be used in
subexpressions.
aggrEgation pipELinE opErators $map : {
input : [ 1 , 2 ] ,
Map calls the p rov i d e d s u b -
a s : “v”
T he aggregation framework can be used to in : { $multiply: [
ex p re ssion o n ce fo r e ac h e l e m e n t in
a n array, a n d co n struct s a n ew ar ray
“$$v”, 2 ] }
perform everything from simple queries to complex from the results (e.g. [2, 4]).
aggregations. }

To use the aggregation framework, pass the aggregat e() $ liter al


Treats “$” as literal instead
function a pipeline of aggregation stages: of evaluating the
subexpression.
Returns the size of the provided
> db.collection.aggregate({$match:{x:1}}, $size: { [ 1 , 2 , 4] }
array (e .g. 3)
... {$limit:10},
... {$group:{_id : “$age”}})

A list of available stages: maKing BaCKups


o p Er a t o r d E s Cr i p t io n
The best way to make a backup is to make a copy of the
{$project : p r o j e c t i o n }
Includes , exclude,s renames, a n d database files while they are in a consistent state (i.e.,
m u n g e s fields. not in the middle of being read from/to).
Qu eri es, take s an arg u m e n t identical
{$match : match}
to that passed to find(). 1.Use the fsync+lock co m m a n d . This flushes all
{ $ l i m i t : num} Limits results to num. in- flight writes to disk a nd p revents n ew ones.
> d b .f s y n c Lo c k ()
{$skip : skip} Skips num results.
2.Copy data files to a new location.
{$sort : s o r t } Sor ts result s by the give n fields. 3.Use the unlock command to unlock the database.
{$group : group}
G rou p s results using t h e > db.fsyncUnlock()
expressions given (see table below).

E x p l o d e s an e m b e d d e d ar ray into To restore from this backup, copy the files to the correct
{$ un win d : f ie ld }
its own top-level documents. server ’s dbpat h and st art the mongod.
{$ redact : expression}
R e m oves sensitive inform ation fro m
t he current aggregation result. If you have a filesystem that does filesystem snapshots
and your journal is on the same volume and you haven’t

© DZo n e, I n c . | DZo n e . c o m
5 Mongodb

done anything stripy with RAID, you can take a snapshot usEr managEmEnt
without locking. In this case, when you restore, the
journal will replay operations to make the data files CHECK CurrEnt usEr priviLEgEs
consistent.
> db.runCommand(
Mongodump is only for backup in special cases. If you ... {
... us e r s I nf o: ” ma n a g e r ”,
decide to use it anyway, don’t fsync+lock first. ... s h o wPr i v i l e ge s : t r u e
... }
... )

rEpLiCa sEt maintEnanCE


CrEatE a supEradmin

KEEping m EmBE rs from B Eing ELE CtEd > use admin


s wi t c h e d t o db
To permanently stop a member from being elected, a d mi n
> db.createUser(
... {
change its priority to 0: ... user: “superAdmin”,
... p wd: “ s a ”,
... roles:
> va r confi g = rs. confi g() ... [
> c o n f i g . m e m b e r s[ 2 ] . p r i o r i t y = 0 ... {
... role: “userAdminA nyD atabase”,
> rs.reconfig(config) ... d b: “ a d mi n”
... }
... ]
... }
To prevent a secondary from being elected temporarily, ... )
connect to it and issue the freeze command:
CrEatE an administrator for a givEn dataBasE
> rs.freeze(10*60) // # of seconds to not become primary
> use sensors
s wi t c h e d t o db s e n s or s
This can be handy if you don’t want to change priorities > db.createUser(
p e rman en t l y b u t n ee d to d o m a i n te n a n ce o n t h e ... {
primary. ... us e r : “ s e n s or s Us e r Ad mi n”,
... p wd: “ pa s s wor d”,
... r ol e s :
dEmoting a mEmBEr
... [
If a m e m b e r is currently primary an d yo u don’t w ant it to ... {
... r ol e: “ u s e r Ad mi n”,
b e , u s e st ep Dow n : ... d b: “ s e ns or s ”
> rs.stepDown(10*60) // # of seconds to not try to become ... }
primary again ... ]
... }
... )
starting a mEmBEr as a stand-aLonE sErvEr
For maintenance, often it is desirable to start up a
viEW usEr roLEs
secondary and be able to do writes on it (e.g., for
building indexes). To accomplish this, you can start up > use sensors
a secondary as a stand-alone mongod temporarily. s wi t c h e d t o db s e n s or s
> db.getUser(“sensor sUserAdmin”)
{
If the seco n d ar y w a s originally started with the “_id” : “sensors.sensorsUserAdmin”,
“user” : “sensorsUserAdmin”,
following a rg uments: “db” : “sensors”,
“roles” : [
$ mongod --dbpath IdataIdb --replSet setName --port 30000 {
“role” :
“userAdmin”, “db” :
Shut it down cleanly and restart it with: “sensors”
}
]
$ mongod --dbpath IdataIdb --port 30001
sHoW roLE priviLEgEs
Note that the dbpath do es not ch ange, but the port
> db.getRole( “userAdmin”, { showPr ivileges: true } )
does and the replSet option is removed (all other
options can remain the same). This mongod will come grant a roLE
up as a stand-alone server. The rest of the replica set
will > d b . g r a n t R o l e s To U s e r (
... “ s e n s or s Us e r Ad mi n”,
be looking for a member on port 30000, not 30001, so ... [
it will just appear to be “down” to the rest of the set. ... { r ol e: “ r e a d”, db: “ a d mi n” }
... ]
... )
When you are finished with maintenance, restart the
server with the original arguments. rEvoKE a roLE

> d b . rger va on kt Re R
o loelseTo
s FU
r osm
e rU( s e r (
... “ s e n s or s Us e r Ad mi n”,
... [
... { r ol e: “ ru es ae d”,r Ad midb:n”, “ addb: “ s e }n s or s ” }
mi n”
... ]
... )

© DZo n e, I n c . | DZo n e . c o m
8 Mongodb

mongodB rEstriCtions 13. A database name is case-sensitive and may have up


t o 64 characters.
1. The maximum document size is 16 megabytes. 14. Collections n a me s cannot contain: $, null o r start
2. Namespaces must be shorter than 123 bytes. with the “syste m.” p refix.

3. Each namespace file must be no larger than 2047 Field names cannot contain: $, null or . (dot)
meg ab y tes.
4. The index entry total size must be less than 1024 additionaL rEsourCEs
bytes.
•Download MongoDB at http://www.mongodb.org/
5. A collection can have up to 64 indexes. downl oa ds
6. The index name (namespace included) cannot be •Documentation is available at
longer than 125 chars. ht t p ://d ocs. mon go db.org
7. A replica set can have at most 12 members. •Download TokuMX distribution at http://www.to
8. A shard key can have at most 512 bytes. kutek.com//tokumx_downloads/

9. A shard key is always immutable. •See the roadmap and fil e bugs and request features
at http://jira.mongodb.org
10. MongoDB non-indexed field sort will return results
only if this o p e ration doesn’ t us e m o re than 32 •Ask questions on the mailing list: http://groups.
m e g a b y te s of m e m o r y. google.com/group/mongodb-user

11. Aggregation pipeline stages are limited to 100


megabytes of RAM. When the limit is exceeded,
an error is thrown. “allowDiskUse” option
allows
aggregation pipeline stages to use temporary files
for
processing.
12. A bulk operation is limited to 1000 operations.

AboUT THE AUTHoR RECoMMEndEd booK


Vlad Mihalcea is a software architect, passionate about How does MongoDB help you manage a huMONGOus
concurrency and data reliability. He’s the creator of amount of data collected through your web
FlexyPool (https://github.com/vladmihalcea/flexy-pool), application? With this authoritative introduction, you’ll
a reactive connection pooling utility. He’s been involved learn
in promoting both SQL and NoSQL solutions and he the many advantages of using documentoriented
blogs at: http://vladmihalcea.com databases, and discover why MongoDB is a
reliable,
high-performance system that allows for almost infinite
horizontal scalability. bUY noW

Browse our ColleCtion of 250+ FREE REsoURCEs, inCluding:


REsEARCH gUidEs: Unbiased insight from leading tech experts
REFCARdz: Library of 200+ reference cards covering the latest tech topics
CoMMUniTiEs: Share links, author articles, and engage with other tech
experts
Join noW
DZone, Inc.
150 Preston Executive Dr.
Suite 201
Cary, NC 27513
DZonecommunitiesdeliverover6millionpageseachmonthtomorethan3.3 888.678.0399
millionsoftware 919.678.0300
developers, architectsanddecisionmakers. DZoneofferssomethingforeveryone, including
news, tutorials, cheatsheets, researchguides, featurearticles, sourcecodeandmore. Refcardz Feedback
Welcome
"DZoneisadeveloper'sdream," saysPC Magazine. refcardz@dzone.com
in any form or by means electronic, mechanical, photocopying, or otherwise, without prior written permission © DZo
of the n e, I n c.
publisher. |
Copyright © 2014 DZone, Inc. All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted,
DZo nSponsorship
e . c o mOpportunities
sales@dzone.com Version 1.0 $7 .9 5

You might also like