mongodb tdg chap2 4 sampler
Post on 14-Apr-2018
220 Views
Preview:
TRANSCRIPT
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
1/48
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
2/48
When you buy an ebook throughoreilly.com, you get lifetime access to the book, and
whenever possible we provide it to you in four, DRM-free file formatsPDF, .epub,
Kindle-compatible .mobi, and Android .apk ebookthat you can use on the devices of
your choice. Our ebook files are fully searchable and you can cut-and-paste and print
them. We also alert you when weve updated the files with corrections and additions.
Learn more at http://oreilly.com/ebooks/
You can also purchase OReilly ebooks throughiTunes,
theAndroid Marketplace, andAmazon.com.
OReilly EbooksYour bookshelf on your devices!
http://oreilly.com/http://oreilly.com/http://oreilly.com/http://bit.ly/oreillyappshttp://bit.ly/oreillyappshttp://bit.ly/oreillyappshttp://www.android.com/market/http://www.android.com/market/http://www.android.com/market/http://amazon.com/http://amazon.com/http://oreilly.com/http://amazon.com/http://www.android.com/market/http://bit.ly/oreillyapps -
7/29/2019 MongoDB TDG Chap2 4 Sampler
3/48
MongoDB: The Definitive GuideE\.ULVWLQD&KRGRURZDQG0LFKDHO'LUROI
&RS\ULJKW.ULVWLQD&KRGRURZDQG0LFKDHO'LUROI$OOULJKWVUHVHUYHG3ULQWHGLQWKH8QLWHG6WDWHVRI$PHULFD
3XEOLVKHGE\25HLOO\0HGLD,QF*UDYHQVWHLQ+LJKZD\1RUWK6HEDVWRSRO&$
25HLOO\ERRNVPD\EHSXUFKDVHGIRUHGXFDWLRQDOEXVLQHVVRUVDOHVSURPRWLRQDOXVH2QOLQHHGLWLRQVDUHDOVRDYDLODEOHIRUPRVWWLWOHVKWWSP\VDIDULERRNVRQOLQHFRP)RUPRUHLQIRUPDWLRQFRQWDFWRXUFRUSRUDWHLQVWLWXWLRQDOVDOHVGHSDUWPHQWRU FRUSRUDWH#RUHLOO\FRP
Editor: -XOLH6WHHOHProduction Editor: 7HUHVD(OVH\Copyeditor: .LP:LPSVHWWProofreader: $SRVWURSKH(GLWLQJ6HUYLFHVProduction Services: 0ROO\6KDUS
Indexer: (OOHQ7URXWPDQ=DLJCover Designer: .DUHQ0RQWJRPHU\Interior Designer: 'DYLG)XWDWRIllustrator: 5REHUW5RPDQR
Printing History:6HSWHPEHU )LUVW(GLWLRQ
1XWVKHOO+DQGERRNWKH1XWVKHOO+DQGERRNORJRDQGWKH25HLOO\ORJRDUHUHJLVWHUHGWUDGHPDUNVRI25HLOO\0HGLD,QF0RQJR'%7KH'HILQLWLYH*XLGHWKHLPDJHRIDPRQJRRVHOHPXUDQGUHODWHGWUDGH
GUHVVDUHWUDGHPDUNVRI25HLOO\0HGLD,QF0DQ\RIWKHGHVLJQDWLRQVXVHGE\PDQXIDFWXUHUVDQGVHOOHUVWRGLVWLQJXLVKWKHLUSURGXFWVDUHFODLPHGDVWUDGHPDUNV:KHUHWKRVHGHVLJQDWLRQVDSSHDULQWKLVERRNDQG25HLOO\0HGLD,QFZDVDZDUHRIDWUDGHPDUNFODLPWKHGHVLJQDWLRQVKDYHEHHQSULQWHGLQFDSVRULQLWLDOFDSV
:KLOHHYHU\SUHFDXWLRQKDVEHHQWDNHQLQWKHSUHSDUDWLRQRIWKLVERRNWKHSXEOLVKHUDQGDXWKRUVDVVXPHQRUHVSRQVLELOLW\IRUHUURUVRURPLVVLRQVRUIRUGDPDJHVUHVXOWLQJIURPWKHXVHRIWKHLQIRUPDWLRQFRQWDLQHGKHUHLQ
,6%1
>0@
http://my.safaribooksonline.com/?portal=oreillymailto:corporate@oreilly.commailto:corporate@oreilly.comhttp://my.safaribooksonline.com/?portal=oreilly -
7/29/2019 MongoDB TDG Chap2 4 Sampler
4/48
Table of Contents
Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1$5LFK'DWD0RGHO (DV\6FDOLQJ 7RQVRI)HDWXUHV :LWKRXW6DFULILFLQJ6SHHG 6LPSOH$GPLQLVWUDWLRQ %XW:DLW7KDWV1RW$OO
2. Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5'RFXPHQWV
&ROOHFWLRQV 6FKHPD)UHH 1DPLQJ
'DWDEDVHV *HWWLQJDQG6WDUWLQJ0RQJR'% 0RQJR'%6KHOO
5XQQLQJWKH6KHOO $0RQJR'%&OLHQW %DVLF2SHUDWLRQVZLWKWKH6KHOO 7LSVIRU8VLQJWKH6KHOO
'DWD7\SHV %DVLF'DWD7\SHV 1XPEHUV 'DWHV $UUD\V (PEHGGHG'RFXPHQWV
BLGDQG2EMHFW,GV
v
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
5/48
3. Creating, Updating, and Deleting Documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23,QVHUWLQJDQG6DYLQJ'RFXPHQWV
%DWFK,QVHUW ,QVHUWV,QWHUQDOVDQG,PSOLFDWLRQV
5HPRYLQJ'RFXPHQWV
5HPRYH6SHHG 8SGDWLQJ'RFXPHQWV
'RFXPHQW5HSODFHPHQW 8VLQJ0RGLILHUV 8SVHUWV 8SGDWLQJ0XOWLSOH'RFXPHQWV 5HWXUQLQJ8SGDWHG'RFXPHQWV
7KH)DVWHVW:ULWH7KLV6LGHRI0LVVLVVLSSL 6DIH2SHUDWLRQV &DWFKLQJ1RUPDO(UURUV
5HTXHVWVDQG&RQQHFWLRQV
4. Querying . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45,QWURGXFWLRQWRILQG
6SHFLI\LQJ:KLFK.H\VWR5HWXUQ /LPLWDWLRQV
4XHU\&ULWHULD 4XHU\&RQGLWLRQDOV 254XHULHV QRW 5XOHVIRU&RQGLWLRQDOV
7\SH6SHFLILF4XHULHV QXOO 5HJXODU([SUHVVLRQV 4XHU\LQJ$UUD\V 4XHU\LQJRQ(PEHGGHG'RFXPHQWV
ZKHUH4XHULHV &XUVRUV
/LPLWV6NLSVDQG6RUWV $YRLGLQJ/DUJH6NLSV $GYDQFHG4XHU\2SWLRQV
*HWWLQJ&RQVLVWHQW5HVXOWV &XUVRU,QWHUQDOV
5. Indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65,QWURGXFWLRQWR,QGH[LQJ
6FDOLQJ,QGH[HV ,QGH[LQJ.H\VLQ(PEHGGHG'RFXPHQWV
vi | Table of Contents
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
6/48
,QGH[LQJIRU6RUWV 8QLTXHO\,GHQWLI\LQJ,QGH[HV
8QLTXH,QGH[HV 'URSSLQJ'XSOLFDWHV &RPSRXQG8QLTXH,QGH[HV
8VLQJH[SODLQDQGKLQW ,QGH[$GPLQLVWUDWLRQ &KDQJLQJ,QGH[HV
*HRVSDWLDO,QGH[LQJ &RPSRXQG*HRVSDWLDO,QGH[HV 7KH(DUWK,V1RWD'3ODQH
6. Aggregation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81FRXQW GLVWLQFW JURXS
8VLQJD)LQDOL]HU 8VLQJD)XQFWLRQDVD.H\
0DS5HGXFH ([DPSOH)LQGLQJ$OO.H\VLQD&ROOHFWLRQ ([DPSOH&DWHJRUL]LQJ:HE3DJHV 0RQJR'%DQG0DS5HGXFH
7. Advanced Topics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93'DWDEDVH&RPPDQGV
+RZ&RPPDQGV:RUN &RPPDQG5HIHUHQFH
&DSSHG&ROOHFWLRQV 3URSHUWLHVDQG8VH&DVHV &UHDWLQJ&DSSHG&ROOHFWLRQV 6RUWLQJ$X1DWXUHO 7DLODEOH&XUVRUV
*ULG)66WRULQJ)LOHV *HWWLQJ6WDUWHGZLWK*ULG)6PRQJRILOHV :RUNLQJZLWK*ULG)6IURPWKH0RQJR'%'ULYHUV 8QGHUWKH+RRG
6HUYHU6LGH6FULSWLQJ GEHYDO 6WRUHG-DYD6FULSW 6HFXULW\
'DWDEDVH5HIHUHQFHV :KDW,VD'%5HI" ([DPSOH6FKHPD
Table of Contents | vii
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
7/48
'ULYHU6XSSRUWIRU'%5HIV :KHQ6KRXOG'%5HIV%H8VHG"
8. Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1116WDUWLQJDQG6WRSSLQJ0RQJR'%
6WDUWLQJIURPWKH&RPPDQG/LQH )LOH%DVHG&RQILJXUDWLRQ 6WRSSLQJ0RQJR'%
0RQLWRULQJ 8VLQJWKH$GPLQ,QWHUIDFH VHUYHU6WDWXV PRQJRVWDW 7KLUG3DUW\3OXJ,QV
6HFXULW\DQG$XWKHQWLFDWLRQ $XWKHQWLFDWLRQ%DVLFV +RZ$XWKHQWLFDWLRQ:RUNV 2WKHU6HFXULW\&RQVLGHUDWLRQV
%DFNXSDQG5HSDLU 'DWD)LOH%DFNXS PRQJRGXPSDQGPRQJRUHVWRUH IV\QFDQG/RFN 6ODYH%DFNXSV 5HSDLU
9. Replication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1270DVWHU6ODYH5HSOLFDWLRQ
2SWLRQV $GGLQJDQG5HPRYLQJ6RXUFHV
5HSOLFD6HWV ,QLWLDOL]LQJD6HW 1RGHVLQD5HSOLFD6HW )DLORYHUDQG3ULPDU\(OHFWLRQ
3HUIRUPLQJ2SHUDWLRQVRQD6ODYH 5HDG6FDOLQJ 8VLQJ6ODYHVIRU'DWD3URFHVVLQJ
+RZ,W:RUNV
7KH2SORJ 6\QFLQJ 5HSOLFDWLRQ6WDWHDQGWKH/RFDO'DWDEDVH %ORFNLQJIRU5HSOLFDWLRQ
$GPLQLVWUDWLRQ 'LDJQRVWLFV &KDQJLQJWKH2SORJ6L]H
viii | Table of Contents
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
8/48
5HSOLFDWLRQZLWK$XWKHQWLFDWLRQ
10. Sharding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143,QWURGXFWLRQWR6KDUGLQJ $XWRVKDUGLQJLQ0RQJR'%
:KHQWR6KDUG 7KH.H\WR6KDUGLQJ6KDUG.H\V
6KDUGLQJDQ([LVWLQJ&ROOHFWLRQ ,QFUHPHQWLQJ6KDUG.H\V9HUVXV5DQGRP6KDUG.H\V +RZ6KDUG.H\V$IIHFW2SHUDWLRQV
6HWWLQJ8S6KDUGLQJ 6WDUWLQJWKH6HUYHUV 6KDUGLQJ'DWD
3URGXFWLRQ&RQILJXUDWLRQ $5REXVW&RQILJ 0DQ\PRQJRV $6WXUG\6KDUG 3K\VLFDO6HUYHUV
6KDUGLQJ$GPLQLVWUDWLRQ FRQILJ&ROOHFWLRQV 6KDUGLQJ&RPPDQGV
11. Example Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155&KHPLFDO6HDUFK(QJLQH-DYD
,QVWDOOLQJWKH-DYD'ULYHU 8VLQJWKH-DYD'ULYHU 6FKHPD'HVLJQ :ULWLQJ7KLVLQ-DYD ,VVXHV
1HZV$JJUHJDWRU3+3 ,QVWDOOLQJWKH3+3'ULYHU 8VLQJWKH3+3'ULYHU 'HVLJQLQJWKH1HZV$JJUHJDWRU 7UHHVRI&RPPHQWV 9RWLQJ
&XVWRP6XEPLVVLRQ)RUPV5XE\
,QVWDOOLQJWKH5XE\'ULYHU 8VLQJWKH5XE\'ULYHU &XVWRP)RUP6XEPLVVLRQ 5XE\2EMHFW0DSSHUVDQG8VLQJ0RQJR'%ZLWK5DLOV
5HDO7LPH$QDO\WLFV3\WKRQ ,QVWDOOLQJ3\0RQJR 8VLQJ3\0RQJR
Table of Contents | ix
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
9/48
0RQJR'%IRU5HDO7LPH$QDO\WLFV 6FKHPD +DQGOLQJD5HTXHVW 8VLQJ$QDO\WLFV'DWD 2WKHU&RQVLGHUDWLRQV
A. Installing MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
B. mongo: The Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
C. MongoDB Internals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
x | Table of Contents
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
10/48
CHAPTER 2
Getting Started
0RQJR'%LVYHU\SRZHUIXOEXWLWLVVWLOOHDV\WRJHWVWDUWHGZLWK,QWKLVFKDSWHUZHOOLQWURGXFHVRPHRIWKHEDVLFFRQFHSWVRI0RQJR'%
$GRFXPHQWLVWKHEDVLFXQLWRIGDWDIRU0RQJR'%URXJKO\HTXLYDOHQWWRDURZLQDUHODWLRQDOGDWDEDVHPDQDJHPHQWV\VWHPEXWPXFKPRUHH[SUHVVLYH
6LPLODUO\DFROOHFWLRQFDQEHWKRXJKWRIDVWKHVFKHPDIUHHHTXLYDOHQWRIDWDEOH
$VLQJOHLQVWDQFHRI0RQJR'%FDQKRVWPXOWLSOHLQGHSHQGHQWGDWDEDVHVHDFKRIZKLFKFDQKDYHLWVRZQFROOHFWLRQVDQGSHUPLVVLRQV
0RQJR'%FRPHVZLWKDVLPSOHEXWSRZHUIXO-DYD6FULSWVKHOOZKLFKLVXVHIXOIRUWKHDGPLQLVWUDWLRQRI0RQJR'%LQVWDQFHVDQGGDWDPDQLSXODWLRQ
(YHU\GRFXPHQWKDVD VSHFLDONH\"_id"WKDWLVXQLTXHDFURVVWKHGRFXPHQWVFROOHFWLRQ
Documents$WWKHKHDUWRI0RQJR'%LVWKHFRQFHSWRIDGRFXPHQWDQRUGHUHGVHWRINH\VZLWKDVVRFLDWHGYDOXHV7KHUHSUHVHQWDWLRQRIDGRFXPHQWGLIIHUVE\SURJUDPPLQJODQJXDJHEXWPRVWODQJXDJHVKDYHDGDWDVWUXFWXUHWKDWLVDQDWXUDOILWVXFKDVDPDSKDVKRUGLFWLRQDU\,Q-DYD6FULSWIRUH[DPSOHGRFXPHQWVDUHUHSUHVHQWHGDVREMHFWV
{"greeting" : "Hello, world!"}
7KLV VLPSOH GRFXPHQW FRQWDLQV D VLQJOH NH\ "greeting" ZLWK D YDOXH RI "Hello,world!"0RVWGRFXPHQWVZLOOEHPRUHFRPSOH[WKDQWKLVVLPSOHRQHDQGRIWHQZLOO
FRQWDLQPXOWLSOHNH\YDOXHSDLUV
{"greeting" : "Hello, world!", "foo" : 3}
5
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
11/48
7KLVH[DPSOHLVDJRRGLOOXVWUDWLRQRIVHYHUDOLPSRUWDQWFRQFHSWV
.H\YDOXHSDLUVLQGRFXPHQWVDUHRUGHUHGWKHHDUOLHUGRFXPHQWLVGLVWLQFWIURPWKHIROORZLQJGRFXPHQW
{"foo" : 3, "greeting" : "Hello, world!"}
,QPRVWFDVHVWKHRUGHULQJRINH\VLQGRFXPHQWVLVQRWLPSRUWDQW,QIDFWLQVRPHSURJUDPPLQJODQJXDJHVWKHGHIDXOWUHSUHVHQWDWLRQRIDGRFXPHQWGRHVQRWHYHQPDLQWDLQRUGHULQJHJGLFWLRQDULHVLQ3\WKRQDQGKDVKHVLQ3HUORU5XE\'ULYHUVIRUWKRVHODQJXDJHVXVXDOO\KDYHVRPHPHFKDQLVPIRUVSHFLI\LQJGRFXPHQWVZLWKRUGHULQJIRUWKHUDUHFDVHVZKHQLWLVQHFHVVDU\7KRVHFDVHVZLOOEHQRWHGWKURXJKRXWWKHWH[W
9DOXHVLQGRFXPHQWVDUHQRWMXVWEOREV7KH\FDQEHRQHRIVHYHUDOGLIIHUHQWGDWDW\SHV RU HYHQ DQ HQWLUH HPEHGGHG GRFXPHQWVHH (PEHGGHG 'RFX
PHQWVRQSDJH,QWKLVH[DPSOHWKHYDOXHIRU"greeting"LVDVWULQJZKHUHDVWKHYDOXHIRU"foo"LVDQLQWHJHU
7KHNH\VLQDGRFXPHQWDUHVWULQJV$Q\87)FKDUDFWHULVDOORZHGLQDNH\ZLWKDIHZQRWDEOHH[FHSWLRQV
.H\VPXVWQRWFRQWDLQWKHFKDUDFWHU?WKHnullFKDUDFWHU7KLVFKDUDFWHULVXVHGWRVLJQLI\WKHHQGRIDNH\
7KHDQGFKDUDFWHUVKDYHVRPHVSHFLDOSURSHUWLHVDQGVKRXOGEHXVHGRQO\LQFHUWDLQFLUFXPVWDQFHVDVGHVFULEHGLQODWHUFKDSWHUV,QJHQHUDOWKH\VKRXOGEHFRQVLGHUHGUHVHUYHGDQGGULYHUVZLOOFRPSODLQLIWKH\DUHXVHGLQDSSURSULDWHO\
.H\VVWDUWLQJZLWKBVKRXOGEHFRQVLGHUHGUHVHUYHGDOWKRXJKWKLVLVQRWVWULFWO\HQIRUFHG
0RQJR'% LV W\SHVHQVLWLYH DQG FDVHVHQVLWLYH )RU H[DPSOH WKHVH GRFXPHQWV DUHGLVWLQFW
{"foo" : 3}{"foo" : "3"}
$VDUHDVWKHVH
{"foo" : 3}{"Foo" : 3}
$ILQDOLPSRUWDQWWKLQJWRQRWHLVWKDWGRFXPHQWVLQ0RQJR'%FDQQRWFRQWDLQGXSOLFDWHNH\V)RUH[DPSOHWKHIROORZLQJLVQRWDOHJDOGRFXPHQW
{"greeting" : "Hello, world!", "greeting" : "Hello, MongoDB!"}
6 | Chapter 2:Getting Started
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
12/48
Collections$FROOHFWLRQLVDJURXSRIGRFXPHQWV,IDGRFXPHQWLVWKH0RQJR'%DQDORJRIDURZLQDUHODWLRQDOGDWDEDVHWKHQDFROOHFWLRQFDQEHWKRXJKWRIDVWKHDQDORJWRDWDEOH
Schema-Free&ROOHFWLRQVDUHVFKHPDIUHH7KLVPHDQVWKDWWKHGRFXPHQWVZLWKLQDVLQJOHFROOHFWLRQFDQKDYHDQ\QXPEHURIGLIIHUHQWVKDSHV)RUH[DPSOHERWKRIWKHIROORZLQJGRFXPHQWVFRXOGEHVWRUHGLQDVLQJOHFROOHFWLRQ
{"greeting" : "Hello, world!"}{"foo" : 5}
1RWHWKDWWKHSUHYLRXVGRFXPHQWVQRWRQO\KDYHGLIIHUHQWW\SHVIRUWKHLUYDOXHVVWULQJYHUVXVLQWHJHUEXWDOVRKDYHHQWLUHO\GLIIHUHQWNH\V%HFDXVHDQ\GRFXPHQWFDQEHSXWLQWRDQ\FROOHFWLRQWKHTXHVWLRQRIWHQDULVHV:K\GRZHQHHGVHSDUDWHFROOHFWLRQVDW
DOO",WVDJRRGTXHVWLRQZLWKQRQHHGIRUVHSDUDWHVFKHPDVIRUGLIIHUHQWNLQGVRIGRFXPHQWV ZK\ VKRXOG ZH XVH PRUH WKDQ RQH FROOHFWLRQ" 7KHUH DUH VHYHUDO JRRGUHDVRQV
.HHSLQJGLIIHUHQWNLQGVRIGRFXPHQWVLQWKHVDPHFROOHFWLRQFDQEHDQLJKWPDUHIRUGHYHORSHUVDQGDGPLQV'HYHORSHUVQHHGWRPDNHVXUHWKDWHDFKTXHU\LVRQO\UHWXUQLQJGRFXPHQWVRIDFHUWDLQNLQGRUWKDWWKHDSSOLFDWLRQFRGHSHUIRUPLQJDTXHU\FDQKDQGOHGRFXPHQWVRIGLIIHUHQWVKDSHV,IZHUHTXHU\LQJIRUEORJSRVWVLWVDKDVVOHWRZHHGRXWGRFXPHQWVFRQWDLQLQJDXWKRUGDWD
,WLVPXFKIDVWHUWRJHWDOLVWRIFROOHFWLRQVWKDQWRH[WUDFWDOLVWRIWKHW\SHVLQDFROOHFWLRQ)RUH[DPSOHLIZHKDGDtypeNH\LQWKHFROOHFWLRQWKDWVDLGZKHWKHU
HDFKGRFXPHQWZDVDVNLPZKROHRUFKXQN\PRQNH\GRFXPHQWLWZRXOGEHPXFKVORZHUWRILQGWKRVHWKUHHYDOXHVLQDVLQJOHFROOHFWLRQWKDQWRKDYHWKUHHVHSDUDWH FROOHFWLRQV DQG TXHU\ IRU WKHLU QDPHV VHH 6XEFROOHFWLRQVRQSDJH
*URXSLQJGRFXPHQWVRIWKHVDPHNLQGWRJHWKHULQWKHVDPHFROOHFWLRQDOORZVIRUGDWDORFDOLW\*HWWLQJVHYHUDOEORJSRVWVIURPDFROOHFWLRQFRQWDLQLQJRQO\SRVWVZLOOOLNHO\UHTXLUHIHZHUGLVNVHHNVWKDQJHWWLQJWKHVDPHSRVWVIURPDFROOHFWLRQFRQWDLQLQJSRVWVDQGDXWKRUGDWD
:HEHJLQWRLPSRVHVRPHVWUXFWXUHRQRXUGRFXPHQWVZKHQZHFUHDWHLQGH[HV7KLVLVHVSHFLDOO\WUXHLQWKHFDVHRIXQLTXHLQGH[HV7KHVHLQGH[HVDUHGHILQHGSHUFROOHFWLRQ%\SXWWLQJRQO\GRFXPHQWVRIDVLQJOHW\SHLQWRWKHVDPHFROOHFWLRQZHFDQLQGH[RXUFROOHFWLRQVPRUHHIILFLHQWO\
$V\RXFDQVHHWKHUHDUHVRXQGUHDVRQVIRUFUHDWLQJDVFKHPDDQGIRUJURXSLQJUHODWHGW\SHVRIGRFXPHQWVWRJHWKHU0RQJR'%MXVWUHOD[HVWKLVUHTXLUHPHQWDQGDOORZVGHYHORSHUVPRUHIOH[LELOLW\
Collections | 7
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
13/48
Naming$FROOHFWLRQLVLGHQWLILHGE\LWVQDPH&ROOHFWLRQQDPHVFDQEHDQ\87)VWULQJZLWKDIHZUHVWULFWLRQV
7KHHPSW\VWULQJLVQRWDYDOLGFROOHFWLRQQDPH
&ROOHFWLRQQDPHVPD\QRWFRQWDLQWKHFKDUDFWHU?WKHnullFKDUDFWHUEHFDXVHWKLVGHOLQHDWHVWKHHQGRIDFROOHFWLRQQDPH
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
14/48
GDWDEDVHLVVWRUHGLQVHSDUDWHILOHVRQGLVN$JRRGUXOHRIWKXPELVWRVWRUHDOOGDWDIRUDVLQJOHDSSOLFDWLRQLQWKHVDPHGDWDEDVH6HSDUDWHGDWDEDVHVDUHXVHIXOZKHQVWRULQJGDWDIRUVHYHUDODSSOLFDWLRQRUXVHUVRQWKHVDPH0RQJR'%VHUYHU
/LNHFROOHFWLRQVGDWDEDVHVDUHLGHQWLILHGE\QDPH'DWDEDVHQDPHVFDQEHDQ\87)VWULQJZLWKWKHIROORZLQJUHVWULFWLRQV
7KHHPSW\VWULQJLVQRWDYDOLGGDWDEDVHQDPH
$GDWDEDVHQDPHFDQQRWFRQWDLQDQ\RIWKHVHFKDUDFWHUVDVLQJOHVSDFH?RU?WKHQXOOFKDUDFWHU
'DWDEDVHQDPHVVKRXOGEHDOOORZHUFDVH
'DWDEDVHQDPHVDUHOLPLWHGWRDPD[LPXPRIE\WHV
2QHWKLQJWRUHPHPEHUDERXWGDWDEDVHQDPHVLVWKDWWKH\ZLOODFWXDOO\HQGXSDVILOHVRQ\RXUILOHV\VWHP7KLVH[SODLQVZK\PDQ\RIWKHSUHYLRXVUHVWULFWLRQVH[LVWLQWKHILUVWSODFH
7KHUHDUHDOVRVHYHUDOUHVHUYHGGDWDEDVHQDPHVZKLFK\RXFDQDFFHVVGLUHFWO\EXWKDYHVSHFLDOVHPDQWLFV7KHVHDUHDVIROORZV
DGPLQ7KLVLVWKHURRWGDWDEDVHLQWHUPVRIDXWKHQWLFDWLRQ,IDXVHULVDGGHGWRWKHDGPLQ GDWDEDVH WKH XVHU DXWRPDWLFDOO\ LQKHULWV SHUPLVVLRQV IRU DOO GDWDEDVHV7KHUHDUHDOVRFHUWDLQVHUYHUZLGHFRPPDQGVWKDWFDQEHUXQRQO\IURPWKH DGPLQGDWDEDVHVXFKDVOLVWLQJDOORIWKHGDWDEDVHVRUVKXWWLQJGRZQWKHVHUYHU
ORFDO7KLVGDWDEDVHZLOOQHYHUEHUHSOLFDWHGDQGFDQEHXVHGWRVWRUHDQ\FROOHFWLRQVWKDWVKRXOGEHORFDOWRDVLQJOHVHUYHUVHH&KDSWHUIRUPRUHLQIRUPDWLRQDERXWUHSOLFDWLRQDQGWKHORFDOGDWDEDVH
FRQILJ:KHQ0RQJRLVEHLQJXVHGLQDVKDUGHGVHWXSVHH&KDSWHUWKHFRQILJGDWDEDVHLVXVHGLQWHUQDOO\WRVWRUHLQIRUPDWLRQDERXWWKHVKDUGV
%\SUHSHQGLQJDFROOHFWLRQVQDPHZLWKLWVFRQWDLQLQJGDWDEDVH\RXFDQJHWDIXOO\TXDOLILHG FROOHFWLRQ QDPH FDOOHG D QDPHVSDFH )RU LQVWDQFH LI \RX DUH XVLQJ WKHEORJSRVWVFROOHFWLRQLQWKHFPVGDWDEDVHWKHQDPHVSDFHRIWKDWFROOHFWLRQZRXOGEHcms.blog.posts1DPHVSDFHVDUHOLPLWHGWRE\WHVLQOHQJWKDQGLQSUDFWLFHVKRXOGEHOHVVWKDQE\WHVORQJ)RUPRUHRQQDPHVSDFHVDQGWKHLQWHUQDOUHSUHVHQWDWLRQ
RIFROOHFWLRQVLQ0RQJR'%VHH$SSHQGL[&
Databases | 9
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
15/48
Getting and Starting MongoDB0RQJR'%LVDOPRVWDOZD\VUXQDVD QHWZRUNVHUYHUWKDWFOLHQWVFDQFRQQHFWWRDQGSHUIRUPRSHUDWLRQVRQ7RVWDUWWKHVHUYHUUXQWKHmongodH[HFXWDEOH
$ ./mongod
./mongod --help for help and startup optionsSun Mar 28 12:31:20 Mongo DB : starting : pid = 44978 port = 27017dbpath = /data/db/ master = 0 slave = 0 64-bitSun Mar 28 12:31:20 db version v1.5.0-pre-, pdfile version 4.5Sun Mar 28 12:31:20 git version: ...Sun Mar 28 12:31:20 sys info: ...Sun Mar 28 12:31:20 waiting for connections on port 27017Sun Mar 28 12:31:20 web admin interface listening on port 28017
2ULI\RXUHRQ:LQGRZVUXQWKLV
$ mongod.exe
)RUGHWDLOHGLQIRUPDWLRQRQLQVWDOOLQJ0RQJR'%RQ\RXUV\VWHPVHH$SSHQGL[$
:KHQUXQZLWKQRDUJXPHQWVmongodZLOOXVHWKHGHIDXOWGDWDGLUHFWRU\GDWDGERU&?GDWD?GE?RQ:LQGRZVDQGSRUW,IWKHGDWDGLUHFWRU\GRHVQRWDOUHDG\H[LVWRULVQRWZULWDEOHWKHVHUYHUZLOOIDLOWRVWDUW,WLVLPSRUWDQWWRFUHDWHWKHGDWDGLUHFWRU\HJPNGLUSGDWDGEDQGWRPDNHVXUH\RXUXVHUKDVSHUPLVVLRQWRZULWHWRWKHGLUHFWRU\EHIRUHVWDUWLQJ0RQJR'%7KHVHUYHUZLOODOVRIDLOWRVWDUWLIWKHSRUWLVQRWDYDLODEOHWKLVLVRIWHQFDXVHGE\DQRWKHULQVWDQFHRI0RQJR'%WKDWLVDOUHDG\UXQQLQJ
7KHVHUYHUZLOOSULQWVRPHYHUVLRQDQGV\VWHPLQIRUPDWLRQDQGWKHQEHJLQZDLWLQJIRUFRQQHFWLRQV%\GHIDXOW0RQJR'%OLVWHQVIRUVRFNHWFRQQHFWLRQVRQSRUW
mongodDOVRVHWVXSDYHU\EDVLF+773VHUYHUWKDWOLVWHQVRQDSRUWKLJKHUWKDQWKHPDLQSRUWLQWKLVFDVH7KLVPHDQVWKDW\RXFDQJHWVRPHDGPLQLVWUDWLYHLQIRUPDWLRQDERXW\RXUGDWDEDVHE\RSHQLQJDZHEEURZVHUDQGJRLQJWRKWWSORFDOKRVW
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
16/48
MongoDB Shell0RQJR'%FRPHVZLWKD-DYD6FULSWVKHOOWKDWDOORZVLQWHUDFWLRQZLWKD0RQJR'%LQVWDQFHIURPWKHFRPPDQGOLQH7KHVKHOOLVYHU\XVHIXOIRUSHUIRUPLQJDGPLQLVWUDWLYHIXQFWLRQVLQVSHFWLQJDUXQQLQJLQVWDQFHRUMXVWSOD\LQJDURXQG7KHmongoVKHOOLVD
FUXFLDOWRROIRUXVLQJ0RQJR'%DQGLVXVHGH[WHQVLYHO\WKURXJKRXWWKHUHVWRIWKHWH[W
Running the Shell7RVWDUWWKHVKHOOUXQWKHmongoH[HFXWDEOH
$ ./mongoMongoDB shell version: 1.6.0url: testconnecting to: testtype "help" for help>
7KHVKHOODXWRPDWLFDOO\DWWHPSWVWRFRQQHFWWRD0RQJR'%VHUYHURQVWDUWXSVRPDNHVXUH\RXVWDUWmongodEHIRUHVWDUWLQJWKHVKHOO
7KHVKHOOLVDIXOOIHDWXUHG-DYD6FULSWLQWHUSUHWHUFDSDEOHRIUXQQLQJDUELWUDU\-DYD6FULSWSURJUDPV7RLOOXVWUDWHWKLVOHWVSHUIRUPVRPHEDVLFPDWK
> x = 200200> x / 5;40
:HFDQDOVROHYHUDJHDOORIWKHVWDQGDUG-DYD6FULSWOLEUDULHV
> Math.sin(Math.PI / 2);
1> new Date("2010/1/1");"Fri Jan 01 2010 00:00:00 GMT-0500 (EST)"> "Hello, World!".replace("World", "MongoDB");Hello, MongoDB!
:HFDQHYHQGHILQHDQGFDOO-DYD6FULSWIXQFWLRQV
> function factorial (n) {... if (n factorial(5);120
1RWHWKDW\RXFDQFUHDWHPXOWLOLQHFRPPDQGV7KHVKHOOZLOOGHWHFWZKHWKHUWKH-DYD6FULSWVWDWHPHQWLVFRPSOHWHZKHQ\RXSUHVV(QWHUDQGLILWLVQRWZLOODOORZ\RXWRFRQWLQXHZULWLQJLWRQWKHQH[WOLQH
MongoDB Shell | 11
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
17/48
A MongoDB Client$OWKRXJKWKHDELOLW\WRH[HFXWHDUELWUDU\-DYD6FULSWLVFRROWKHUHDOSRZHURIWKHVKHOOOLHVLQWKHIDFWWKDWLWLVDOVRDVWDQGDORQH0RQJR'%FOLHQW2QVWDUWXSWKHVKHOOFRQQHFWVWRWKHWHVWGDWDEDVHRQD0RQJR'%VHUYHUDQGDVVLJQVWKLVGDWDEDVHFRQQHFWLRQWRWKHJOREDOYDULDEOHdb7KLVYDULDEOHLVWKHSULPDU\DFFHVVSRLQWWR0RQJR'%WKURXJKWKHVKHOO
7KHVKHOOFRQWDLQVVRPHDGGRQVWKDWDUHQRWYDOLG-DYD6FULSWV\QWD[EXWZHUHLPSOHPHQWHGEHFDXVHRIWKHLUIDPLOLDULW\WRXVHUVRI64/VKHOOV7KHDGGRQVGRQRWSURYLGHDQ\H[WUDIXQFWLRQDOLW\EXWWKH\DUHQLFHV\QWDFWLFVXJDU)RULQVWDQFHRQHRIWKHPRVWLPSRUWDQWRSHUDWLRQVLVVHOHFWLQJZKLFKGDWDEDVHWRXVH
> use foobarswitched to db foobar
1RZLI\RXORRNDWWKHdbYDULDEOH\RXFDQVHHWKDWLWUHIHUVWRWKHIRREDUGDWDEDVH
> db
foobar
%HFDXVHWKLVLVD-DYD6FULSWVKHOOW\SLQJDYDULDEOHZLOOFRQYHUWWKHYDULDEOHWRDVWULQJLQWKLVFDVHWKHGDWDEDVHQDPHDQGSULQWLW
&ROOHFWLRQVFDQEHDFFHVVHGIURPWKHdbYDULDEOH)RUH[DPSOHdb.bazUHWXUQVWKHED]FROOHFWLRQLQWKHFXUUHQWGDWDEDVH1RZWKDWZHFDQDFFHVVDFROOHFWLRQLQWKHVKHOOZHFDQSHUIRUPDOPRVWDQ\GDWDEDVHRSHUDWLRQ
Basic Operations with the Shell:HFDQXVH WKH IRXU EDVLFRSHUDWLRQV FUHDWH UHDGXSGDWHDQG GHOHWH&58'WRPDQLSXODWHDQGYLHZGDWDLQWKHVKHOO
Create
7KHinsertIXQFWLRQDGGVDGRFXPHQWWRDFROOHFWLRQ)RUH[DPSOHVXSSRVHZHZDQWWRVWRUHDEORJSRVW)LUVWZHOOFUHDWHDORFDOYDULDEOHFDOOHGpostWKDWLVD-DYD6FULSWREMHFW UHSUHVHQWLQJ RXU GRFXPHQW ,W ZLOO KDYH WKH NH\V "title" "content" DQG"date"WKHGDWHWKDWLWZDVSXEOLVKHG
> post = {"title" : "My Blog Post",... "content" : "Here's my blog post.",... "date" : new Date()}{
"title" : "My Blog Post","content" : "Here's my blog post.","date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)"
}
7KLVREMHFWLVDYDOLG0RQJR'%GRFXPHQWVRZHFDQVDYHLWWRWKHEORJFROOHFWLRQXVLQJWKHinsertPHWKRG
12 | Chapter 2:Getting Started
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
18/48
> db.blog.insert(post)
7KHEORJSRVWKDVEHHQVDYHGWRWKHGDWDEDVH:HFDQVHHLWE\FDOOLQJfindRQWKHFROOHFWLRQ
> db.blog.find(){
"_id" : ObjectId("4b23c3ca7525f35f94b60a2d"),"title" : "My Blog Post","content" : "Here's my blog post.","date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)"
}
db.blog.findOne(){
"_id" : ObjectId("4b23c3ca7525f35f94b60a2d"),"title" : "My Blog Post","content" : "Here's my blog post.","date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)"
}
findDQGfindOneFDQDOVREHSDVVHGFULWHULDLQWKHIRUPRIDTXHU\GRFXPHQW7KLVZLOOUHVWULFWWKHGRFXPHQWVPDWFKHGE\WKHTXHU\7KHVKHOOZLOODXWRPDWLFDOO\GLVSOD\XS
WRGRFXPHQWVPDWFKLQJDfindEXWPRUHFDQEHIHWFKHG6HH &KDSWHUIRUPRUHLQIRUPDWLRQRQTXHU\LQJ
Update
,IZHZRXOGOLNHWRPRGLI\RXUSRVWZHFDQXVHupdateupdateWDNHVDWOHDVWWZRSDUDPHWHUVWKHILUVWLVWKHFULWHULDWRILQGZKLFKGRFXPHQWWRXSGDWHDQGWKHVHFRQGLVWKHQHZGRFXPHQW6XSSRVHZHGHFLGHWRHQDEOHFRPPHQWVRQWKHEORJSRVWZHFUHDWHGHDUOLHU:HOOQHHGWRDGGDQDUUD\RIFRPPHQWVDVWKHYDOXHIRUDQHZNH\LQRXUGRFXPHQW
7KHILUVWVWHSLVWRPRGLI\WKHYDULDEOHpostDQGDGGD"comments"NH\
> post.comments = [][ ]
7KHQZHSHUIRUPWKHXSGDWHUHSODFLQJWKHSRVWWLWOHG0\%ORJ3RVWZLWKRXUQHZYHUVLRQRIWKHGRFXPHQW
> db.blog.update({title : "My Blog Post"}, post)
MongoDB Shell | 13
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
19/48
1RZWKHGRFXPHQWKDVD"comments"NH\,IZHFDOOfindDJDLQZHFDQVHHWKHQHZNH\
> db.blog.find(){
"_id" : ObjectId("4b23c3ca7525f35f94b60a2d"),"title" : "My Blog Post","content" : "Here's my blog post.",
"date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)""comments" : [ ]}
Delete
removeGHOHWHVGRFXPHQWVSHUPDQHQWO\IURPWKHGDWDEDVH&DOOHGZLWKQRSDUDPHWHUVLWUHPRYHVDOO GRFXPHQWVIURPDFROOHFWLRQ,W FDQ DOVRWDNHDGRFXPHQWVSHFLI\LQJFULWHULDIRUUHPRYDO)RUH[DPSOHWKLVZRXOGUHPRYHWKHSRVWZHMXVWFUHDWHG
> db.blog.remove({title : "My Blog Post"})
1RZWKHFROOHFWLRQZLOOEHHPSW\DJDLQ
Tips for Using the Shell%HFDXVHmongoLVVLPSO\D-DYD6FULSWVKHOO\RXFDQJHWDJUHDWGHDORIKHOSIRULWE\VLPSO\ORRNLQJXS-DYD6FULSWGRFXPHQWDWLRQRQOLQH7KHVKHOODOVRLQFOXGHVEXLOWLQKHOSWKDWFDQEHDFFHVVHGE\W\SLQJhelp
> helpHELP
show dbs show database namesshow collections show collections in current databaseshow users show users in current database
show profile show recent system.profile entries w. time >= 1msuse set current database to db.help() help on DB methodsdb.foo.help() help on collection methodsdb.foo.find() list objects in collection foodb.foo.find( { a : 1 } ) list objects in foo where a == 1it result of the last line evaluated
+HOSIRUGDWDEDVHOHYHOFRPPDQGVLVSURYLGHGE\db.help();DQGKHOSDWWKHFROOHFWLRQVFDQEHDFFHVVHGZLWKdb.foo.help();
$JRRGZD\RIILJXULQJRXWZKDWDIXQFWLRQLVGRLQJLVWRW\SHLWZLWKRXWWKHSDUHQWKHVHV7KLVZLOOSULQWWKH-DYD6FULSWVRXUFHFRGHIRUWKHIXQFWLRQ)RUH[DPSOHLIZHDUHFXULRXV
DERXWKRZWKHupdateIXQFWLRQZRUNVRUFDQQRWUHPHPEHUWKHRUGHURISDUDPHWHUVZHFDQGRWKHIROORZLQJ
> db.foo.updatefunction (query, obj, upsert, multi) {
assert(query, "need a query");assert(obj, "need an object");this._validateObject(obj);this._mongo.update(this._fullName, query, obj,
14 | Chapter 2:Getting Started
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
20/48
upsert ? true : false, multi ? true : false);}
7KHUHLVDOVRDQDXWRJHQHUDWHG$3,RIDOOWKH-DYD6FULSWIXQFWLRQVSURYLGHGE\WKHVKHOODWKWWSDSLPRQJRGERUJMV
Inconvenient collection names)HWFKLQJDFROOHFWLRQZLWK db.collectionNameDOPRVWDOZD\VZRUNVXQOHVVWKHFROOHFWLRQQDPHDFWXDOO\LVDSURSHUW\RIWKHGDWDEDVHFODVV)RULQVWDQFHLIZHDUHWU\LQJWRDFFHVVWKHYHUVLRQFROOHFWLRQZHFDQQRWVD\db.versionEHFDXVHdb.versionLVDGDWDEDVHIXQFWLRQ,WUHWXUQVWKHYHUVLRQRIWKHUXQQLQJ0RQJR'%VHUYHU
> db.versionfunction () {
return this.serverBuildInfo().version;}
dbVFROOHFWLRQUHWXUQLQJEHKDYLRULVRQO\DIDOOEDFNIRUZKHQ-DYD6FULSWFDQQRWILQGD
PDWFKLQJSURSHUW\:KHQWKHUHLVDSURSHUW\ZLWKWKHVDPHQDPHDVWKHGHVLUHGFROOHFWLRQZHFDQXVHWKHgetCollectionIXQFWLRQ
> db.getCollection("version");test.version
7KLVFDQDOVREHKDQG\IRUFROOHFWLRQVZLWKLQYDOLG-DYD6FULSWLQWKHLUQDPHV)RUH[DPSOHIRREDULVDYDOLGFROOHFWLRQQDPHEXWLWVYDULDEOHVXEWUDFWLRQLQ-DYD6FULSW
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
21/48
Basic Data Types'RFXPHQWVLQ0RQJR'%FDQEHWKRXJKWRIDV-621OLNHLQWKDWWKH\DUHFRQFHSWXDOO\VLPLODUWRREMHFWVLQ-DYD6FULSW-621LVDVLPSOHUHSUHVHQWDWLRQRIGDWDWKHVSHFLILFDWLRQFDQEHGHVFULEHGLQDERXWRQHSDUDJUDSK KWWSZZZMVRQRUJSURYHVLWDQGOLVWVRQO\VL[GDWDW\SHV7KLVLVDJRRGWKLQJLQPDQ\ZD\VLWVHDV\WRXQGHUVWDQGSDUVHDQGUHPHPEHU2QWKHRWKHUKDQG-621VH[SUHVVLYHFDSDELOLWLHVDUHOLPLWHGEHFDXVHWKHRQO\W\SHVDUHQXOOERROHDQQXPHULFVWULQJDUUD\DQGREMHFW
$OWKRXJKWKHVHW\SHVDOORZIRUDQLPSUHVVLYHDPRXQWRIH[SUHVVLYLW\WKHUHDUHDFRXSOHRIDGGLWLRQDOW\SHVWKDWDUHFUXFLDOIRUPRVWDSSOLFDWLRQVHVSHFLDOO\ZKHQZRUNLQJZLWKDGDWDEDVH)RUH[DPSOH-621KDVQRGDWHW\SHZKLFKPDNHVZRUNLQJZLWKGDWHVHYHQPRUHDQQR\LQJWKDQLWXVXDOO\LV7KHUHLVDQXPEHUW\SHEXWRQO\RQHWKHUHLVQRZD\WRGLIIHUHQWLDWHIORDWVDQGLQWHJHUVQHYHUPLQGDQ\GLVWLQFWLRQEHWZHHQELWDQGELWQXPEHUV7KHUHLVQRZD\WRUHSUHVHQWRWKHUFRPPRQO\XVHGW\SHVHLWKHUVXFKDVUHJXODUH[SUHVVLRQVRUIXQFWLRQV
0RQJR'%DGGVVXSSRUWIRUDQXPEHURIDGGLWLRQDOGDWDW\SHVZKLOHNHHSLQJ-621VHVVHQWLDONH\YDOXHSDLUQDWXUH([DFWO\KRZYDOXHVRIHDFKW\SHDUHUHSUHVHQWHGYDULHVE\ODQJXDJHEXWWKLVLVDOLVWRIWKHFRPPRQO\VXSSRUWHGW\SHVDQGKRZWKH\DUHUHSUHVHQWHGDVSDUWRIDGRFXPHQWLQWKHVKHOO
QXOO1XOOFDQEHXVHGWRUHSUHVHQWERWKDQXOOYDOXHDQGDQRQH[LVWHQWILHOG
{"x" : null}
ERROHDQ7KHUHLVDERROHDQW\SHZKLFKZLOOEHXVHGIRUWKHYDOXHV'true'DQG'false'
{"x" : true}
ELWLQWHJHU7KLVFDQQRWEHUHSUHVHQWHGRQWKHVKHOO$VPHQWLRQHGHDUOLHU-DYD6FULSWVXSSRUWVRQO\ELWIORDWLQJSRLQWQXPEHUVVRELWLQWHJHUVZLOOEHFRQYHUWHGLQWRWKRVH
ELWLQWHJHU$JDLQWKHVKHOOFDQQRWUHSUHVHQWWKHVH7KHVKHOOZLOOGLVSOD\WKHPXVLQJDVSHFLDOHPEHGGHGGRFXPHQWVHHWKHVHFWLRQ1XPEHUVRQSDJHIRUGHWDLOV
ELWIORDWLQJSRLQWQXPEHU$OOQXPEHUVLQWKHVKHOOZLOOEHRIWKLVW\SH7KXVWKLVZLOOEHDIORDWLQJSRLQW
QXPEHU{"x" : 3.14}
$VZLOOWKLV
{"x" : 3}
VWULQJ$Q\VWULQJRI87)FKDUDFWHUVFDQEHUHSUHVHQWHGXVLQJWKHVWULQJW\SH
16 | Chapter 2:Getting Started
http://www.json.org/http://www.json.org/ -
7/29/2019 MongoDB TDG Chap2 4 Sampler
22/48
{"x" : "foobar"}
V\PERO7KLVW\SHLVQRWVXSSRUWHGE\WKHVKHOO,IWKHVKHOOJHWVDV\PEROIURPWKHGDWDEDVHLWZLOOFRQYHUWLWLQWRDVWULQJ
REMHFWLG
$QREMHFWLGLVDXQLTXHE\WH,'IRUGRFXPHQWV6HHWKHVHFWLRQBLGDQG2EMHFW,GVRQSDJHIRUGHWDLOV
{"x" : ObjectId()}
GDWH'DWHVDUHVWRUHGDVPLOOLVHFRQGVVLQFHWKHHSRFK7KHWLPH]RQHLVQRWVWRUHG
{"x" : new Date()}
UHJXODUH[SUHVVLRQ'RFXPHQWVFDQFRQWDLQUHJXODUH[SUHVVLRQVXVLQJ-DYD6FULSWVUHJXODUH[SUHVVLRQV\QWD[
{"x" : /foobar/i}
FRGH'RFXPHQWVFDQDOVRFRQWDLQ-DYD6FULSWFRGH
{"x" : function() { /* ... */ }}
ELQDU\GDWD%LQDU\GDWDLVDVWULQJRIDUELWUDU\E\WHV,WFDQQRWEHPDQLSXODWHGIURPWKHVKHOO
PD[LPXPYDOXH%621FRQWDLQVDVSHFLDOW\SHUHSUHVHQWLQJWKHODUJHVWSRVVLEOHYDOXH7KHVKHOOGRHV
QRWKDYHDW\SHIRUWKLVPLQLPXPYDOXH
%621FRQWDLQVDVSHFLDOW\SHUHSUHVHQWLQJWKHVPDOOHVWSRVVLEOHYDOXH7KHVKHOOGRHVQRWKDYHDW\SHIRUWKLV
XQGHILQHG8QGHILQHGFDQEHXVHGLQGRFXPHQWVDVZHOO-DYD6FULSWKDVGLVWLQFWW\SHVIRUQXOODQGXQGHILQHG
{"x" : undefined}
DUUD\
6HWVRUOLVWVRIYDOXHVFDQEHUHSUHVHQWHGDVDUUD\V{"x" : ["a", "b", "c"]}
HPEHGGHGGRFXPHQW'RFXPHQWV FDQ FRQWDLQ HQWLUH GRFXPHQWV HPEHGGHG DV YDOXHV LQ D SDUHQWGRFXPHQW
{"x" : {"foo" : "bar"}}
Data Types | 17
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
23/48
Numbers-DYD6FULSWKDVRQHQXPEHUW\SH%HFDXVH0RQJR'%KDVWKUHHQXPEHUW\SHVE\WHLQWHJHUE\WHLQWHJHUDQGE\WHIORDWWKHVKHOOKDVWRKDFNDURXQG-DYD6FULSWVOLPLWDWLRQVDELW%\GHIDXOWDQ\QXPEHULQWKHVKHOOLVWUHDWHGDVDGRXEOHE\0RQJR'%7KLVPHDQVWKDWLI\RXUHWULHYHDE\WHLQWHJHUIURPWKHGDWDEDVHPDQLSXODWHLWVGRFXPHQWDQGVDYHLWEDFNWRWKHGDWDEDVH HYHQZLWKRXWFKDQJLQJWKHLQWHJHUWKHLQWHJHUZLOOEHUHVDYHGDVDIORDWLQJSRLQWQXPEHU7KXVLWLVJHQHUDOO\DJRRGLGHDQRWWRRYHUZULWHHQWLUHGRFXPHQWVIURPWKHVKHOOVHH&KDSWHUIRULQIRUPDWLRQRQPDNLQJFKDQJHVWRWKHYDOXHVRILQGLYLGXDONH\V
$QRWKHUSUREOHPZLWKHYHU\QXPEHUEHLQJUHSUHVHQWHGE\DGRXEOHLVWKDWWKHUHDUHVRPHE\WHLQWHJHUVWKDWFDQQRWEHDFFXUDWHO\UHSUHVHQWHGE\E\WHIORDWV7KHUHIRUHLI\RXVDYHDQE\WHLQWHJHUDQGORRNDWLWLQWKHVKHOOWKHVKHOOZLOOGLVSOD\LWDVDQHPEHGGHGGRFXPHQWLQGLFDWLQJWKDWLWPLJKWQRWEHH[DFW)RUH[DPSOHLIZHVDYHDGRFXPHQWZLWKD"myInteger"NH\ZKRVHYDOXHLVWKHELWLQWHJHU3DQGWKHQORRNDWLWLQWKHVKHOOLWZLOOORRNOLNHWKLV
> doc = db.nums.findOne(){
"_id" : ObjectId("4c0beecfd096a2580fe6fa08"),"myInteger" : {
"floatApprox" : 3}
}
7KHQXPEHULVQRWFKDQJHGLQWKHGDWDEDVHXQOHVV\RXPRGLI\DQGUHVDYHWKHREMHFWIURPWKHVKHOOLQZKLFKFDVHLWZLOOWXUQLQWRDIORDWWKHHPEHGGHGGRFXPHQWMXVWLQGLFDWHVWKDWWKHVKHOOLVGLVSOD\LQJDIORDWLQJSRLQWDSSUR[LPDWLRQRIDQE\WHLQWHJHU
,IWKLVHPEHGGHGGRFXPHQWKDVRQO\RQHNH\LWLVLQIDFWH[DFW,I\RXLQVHUWDQE\WHLQWHJHUWKDWFDQQRWEHDFFXUDWHO\GLVSOD\HGDVDGRXEOHWKHVKHOOZLOODGGWZRNH\V"top"DQG"bottom"FRQWDLQLQJWKHELWLQWHJHUVUHSUHVHQWLQJWKHKLJKRUGHUE\WHVDQGORZRUGHUE\WHVRIWKHLQWHJHUUHVSHFWLYHO\)RULQVWDQFHLIZHLQVHUW9223372036854775807WKHVKHOOZLOOVKRZXVWKHIROORZLQJ
> db.nums.findOne(){
"_id" : ObjectId("4c0beecfd096a2580fe6fa09"),"myInteger" : {
"floatApprox" : 9223372036854776000,"top" : 2147483647,
"bottom" : 4294967295}}
7KH"floatApprox"HPEHGGHGGRFXPHQWVDUHVSHFLDODQGFDQEHPDQLSXODWHGDVQXPEHUVDVZHOODVGRFXPHQWV
> doc.myInteger + 14
18 | Chapter 2:Getting Started
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
24/48
> doc.myInteger.floatApprox3
$OOE\WHLQWHJHUVFDQEHUHSUHVHQWHGH[DFWO\E\DQE\WHIORDWLQJSRLQWQXPEHUVRWKH\DUHGLVSOD\HGQRUPDOO\
Dates,Q-DYD6FULSWWKHDateREMHFWLVXVHGIRU0RQJR'%VGDWHW\SH:KHQFUHDWLQJDQHZDateREMHFWDOZD\VFDOOnew Date(...)QRWMXVWDate(...)&DOOLQJWKHFRQVWUXFWRUDVDIXQFWLRQWKDWLVQRWLQFOXGLQJnewUHWXUQVDVWULQJUHSUHVHQWDWLRQRIWKHGDWHQRWDQDFWXDODateREMHFW7KLVLVQRW0RQJR'%VFKRLFHLWLVKRZ-DYD6FULSWZRUNV,I\RXDUHQRWFDUHIXOWRDOZD\VXVHWKHDateFRQVWUXFWRU\RXFDQHQGXSZLWKDPLVKPDVKRIVWULQJVDQGGDWHV6WULQJVGRQRWPDWFKGDWHVDQGYLFHYHUVDVRWKLVFDQFDXVHSUREOHPVZLWKUHPRYLQJXSGDWLQJTXHU\LQJSUHWW\PXFKHYHU\WKLQJ
)RUDIXOOH[SODQDWLRQRI-DYD6FULSWV DateFODVVDQGDFFHSWDEOHIRUPDWVIRUWKHFRQ
VWUXFWRUVHH(&0$6FULSWVSHFLILFDWLRQVHFWLRQDYDLODEOHIRUGRZQORDGDW KWWSZZZHFPDVFULSWRUJ
'DWHVLQWKHVKHOODUHGLVSOD\HGXVLQJORFDOWLPH]RQHVHWWLQJV+RZHYHUGDWHVLQWKHGDWDEDVHDUHMXVWVWRUHGDVPLOOLVHFRQGVVLQFHWKHHSRFKVRWKH\KDYHQRWLPH]RQHLQIRUPDWLRQDVVRFLDWHGZLWKWKHP7LPH]RQHLQIRUPDWLRQFRXOGRIFRXUVHEHVWRUHGDVWKHYDOXHIRUDQRWKHUNH\
Arrays$UUD\V DUH YDOXHV WKDW FDQ EHLQWHUFKDQJHDEO\XVHGIRUERWK RUGHUHG RSHUDWLRQVDV
WKRXJKWKH\ZHUHOLVWVVWDFNVRUTXHXHVDQGXQRUGHUHGRSHUDWLRQVDVWKRXJKWKH\ZHUHVHWV
,QWKHIROORZLQJGRFXPHQWWKHNH\"things"KDVDQDUUD\YDOXH
{"things" : ["pie", 3.14]}
$VZHFDQVHHIURPWKHH[DPSOHDUUD\VFDQFRQWDLQGLIIHUHQWGDWDW\SHVDVYDOXHVLQWKLVFDVHDVWULQJDQGDIORDWLQJSRLQWQXPEHU,QIDFWDUUD\YDOXHVFDQEHDQ\RIWKHVXSSRUWHGYDOXHVIRUQRUPDONH\YDOXHSDLUVHYHQQHVWHGDUUD\V
2QHRIWKHJUHDWWKLQJVDERXWDUUD\VLQGRFXPHQWVLVWKDW0RQJR'%XQGHUVWDQGVWKHLUVWUXFWXUHDQGNQRZVKRZWRUHDFKLQVLGHRIDUUD\VWRSHUIRUPRSHUDWLRQVRQ
WKHLUFRQWHQWV7KLVDOORZVXVWRTXHU\RQDUUD\VDQGEXLOGLQGH[HVXVLQJWKHLUFRQWHQWV)RULQVWDQFHLQWKHSUHYLRXVH[DPSOH0RQJR'%FDQTXHU\IRUDOOGRFXPHQWVZKHUHLVDQHOHPHQWRIWKH"things"DUUD\,IWKLVLVDFRPPRQTXHU\\RXFDQHYHQFUHDWHDQLQGH[RQWKH"things"NH\WRLPSURYHWKHTXHU\VVSHHG
0RQJR'% DOVR DOORZVDWRPLF XSGDWHV WKDW PRGLI\WKH FRQWHQWV RI DUUD\V VXFK DVUHDFKLQJLQWRWKHDUUD\DQGFKDQJLQJWKHYDOXHSLHWRSL:HOOVHHPRUHH[DPSOHVRIWKHVHW\SHVRIRSHUDWLRQVWKURXJKRXWWKHWH[W
Data Types | 19
http://www.ecmascript.org/http://www.ecmascript.org/http://www.ecmascript.org/http://www.ecmascript.org/ -
7/29/2019 MongoDB TDG Chap2 4 Sampler
25/48
Embedded Documents(PEHGGHGGRFXPHQWVDUHHQWLUH0RQJR'%GRFXPHQWVWKDWDUHXVHGDVWKHYDOXHIRUDNH\LQDQRWKHUGRFXPHQW7KH\FDQEHXVHGWRRUJDQL]HGDWDLQDPRUHQDWXUDOZD\WKDQMXVWDIODWVWUXFWXUH
)RUH[DPSOHLIZHKDYHDGRFXPHQWUHSUHVHQWLQJDSHUVRQDQGZDQWWRVWRUHKLVDGGUHVVZHFDQQHVWWKLVLQIRUPDWLRQLQDQHPEHGGHG"address"GRFXPHQW
{"name" : "John Doe","address" : {
"street" : "123 Park Street","city" : "Anytown","state" : "NY"
}}
7KHYDOXHIRUWKH"address"NH\LQWKHSUHYLRXVH[DPSOHLVDQRWKHUGRFXPHQWZLWKLWV
RZQYDOXHVIRU"street""city"DQG"state"$VZLWKDUUD\V0RQJR'%XQGHUVWDQGVWKHVWUXFWXUHRIHPEHGGHGGRFXPHQWVDQGLVDEOHWRUHDFKLQVLGHRIWKHPWREXLOGLQGH[HVSHUIRUPTXHULHVRUPDNHXSGDWHV
:HOOGLVFXVVVFKHPDGHVLJQLQGHSWKODWHUEXWHYHQIURPWKLVEDVLFH[DPSOHZHFDQEHJLQWRVHHKRZHPEHGGHGGRFXPHQWVFDQFKDQJHWKHZD\ZHZRUNZLWKGDWD,QDUHODWLRQDOGDWDEDVHWKHSUHYLRXVGRFXPHQWZRXOGSUREDEO\EHPRGHOHGDVWZRVHSDUDWHURZVLQWZRGLIIHUHQWWDEOHVRQHIRUSHRSOHDQGRQHIRUDGGUHVVHV:LWK0RQJR'%ZHFDQHPEHGWKHDGGUHVVGRFXPHQWGLUHFWO\ZLWKLQWKHSHUVRQGRFXPHQW:KHQXVHGSURSHUO\HPEHGGHGGRFXPHQWVFDQSURYLGHDPRUHQDWXUDODQGRIWHQPRUHHIILFLHQWUHSUHVHQWDWLRQRILQIRUPDWLRQ
7KHIOLSVLGHRIWKLVLVWKDWZHDUHEDVLFDOO\GHQRUPDOL]LQJVRWKHUHFDQEHPRUHGDWDUHSHWLWLRQZLWK0RQJR'%6XSSRVHDGGUHVVHVZHUHDVHSDUDWHWDEOHLQDUHODWLRQDOGDWDEDVHDQGZHQHHGHGWRIL[DW\SRLQDQDGGUHVV:KHQZHGLGDMRLQZLWKSHRSOHDQG DGGUHVVHV ZHG JHW WKH XSGDWHG DGGUHVV IRU HYHU\RQH ZKR VKDUHV LW :LWK0RQJR'%ZHGQHHGWRIL[WKHW\SRLQHDFKSHUVRQVGRFXPHQW
_id and ObjectIds(YHU\GRFXPHQWVWRUHGLQ0RQJR'%PXVWKDYHDQ"_id"NH\7KH"_id"NH\VYDOXHFDQEHDQ\W\SHEXWLWGHIDXOWVWRDQObjectId,QDVLQJOHFROOHFWLRQHYHU\GRFXPHQW
PXVWKDYHDXQLTXHYDOXHIRU"_id"ZKLFKHQVXUHVWKDWHYHU\GRFXPHQWLQDFROOHFWLRQFDQEHXQLTXHO\LGHQWLILHG7KDWLVLI\RXKDGWZRFROOHFWLRQVHDFKRQHFRXOGKDYHDGRFXPHQWZKHUHWKHYDOXHIRU"_id"ZDV+RZHYHUQHLWKHUFROOHFWLRQFRXOGFRQWDLQPRUHWKDQRQHGRFXPHQWZKHUH"_id"ZDV
20 | Chapter 2:Getting Started
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
26/48
ObjectIds
ObjectIdLVWKHGHIDXOWW\SHIRU"_id",WLVGHVLJQHGWREHOLJKWZHLJKWZKLOHVWLOOEHLQJHDV\WRJHQHUDWHLQDJOREDOO\XQLTXHZD\DFURVVGLVSDUDWHPDFKLQHV7KLVLVWKHPDLQUHDVRQZK\0RQJR'%XVHVObjectIdVDVRSSRVHGWRVRPHWKLQJPRUHWUDGLWLRQDOOLNHDQDXWRLQFUHPHQWLQJSULPDU\NH\LWLVGLIILFXOWDQGWLPHFRQVXPLQJWRV\QFKURQL]H
DXWRLQFUHPHQWLQJSULPDU\NH\VDFURVVPXOWLSOHVHUYHUV%HFDXVH0RQJR'%ZDVGHVLJQHGIURPWKHEHJLQQLQJWREHDGLVWULEXWHGGDWDEDVHGHDOLQJZLWKPDQ\QRGHVLVDQLPSRUWDQWFRQVLGHUDWLRQ7KHObjectIdW\SHDVZHOOVHHLVHDV\WRJHQHUDWHLQDVKDUGHGHQYLURQPHQW
ObjectIdVXVHE\WHVRIVWRUDJHZKLFKJLYHVWKHPDVWULQJUHSUHVHQWDWLRQWKDWLVKH[DGHFLPDOGLJLWVGLJLWVIRUHDFKE\WH7KLVFDXVHVWKHPWRDSSHDUODUJHUWKDQWKH\DUHZKLFKPDNHVVRPHSHRSOHQHUYRXV,WVLPSRUWDQW WRQRWHWKDWHYHQWKRXJKDQObjectIdLVRIWHQUHSUHVHQWHGDVDJLDQWKH[DGHFLPDOVWULQJWKHVWULQJLVDFWXDOO\WZLFHDVORQJDVWKHGDWDEHLQJVWRUHG
,I\RXFUHDWHPXOWLSOHQHZObjectIdVLQUDSLGVXFFHVVLRQ\RXFDQVHHWKDWRQO\WKHODVWIHZ GLJLWV FKDQJH HDFK WLPH ,Q DGGLWLRQ D FRXSOH RI GLJLWV LQ WKH PLGGOH RI WKHObjectIdZLOOFKDQJHLI\RXVSDFHWKHFUHDWLRQVRXWE\DFRXSOHRIVHFRQGV7KLVLVEHFDXVHRIWKHPDQQHULQZKLFKObjectIdVDUHFUHDWHG7KHE\WHVRIDQObjectIdDUHJHQHUDWHGDVIROORZV
0 1 2 3 4 5 6 7 8 9 10 11
Timestamp Machine PID Increment
7KHILUVWIRXUE\WHVRIDQObjectIdDUHDWLPHVWDPSLQVHFRQGVVLQFHWKHHSRFK7KLV
SURYLGHVDFRXSOHRIXVHIXOSURSHUWLHV 7KHWLPHVWDPSZKHQFRPELQHGZLWKWKHQH[WILYHE\WHVZKLFKZLOOEHGHVFULEHG
LQDPRPHQWSURYLGHVXQLTXHQHVVDWWKHJUDQXODULW\RIDVHFRQG
%HFDXVHWKHWLPHVWDPSFRPHVILUVW LWPHDQVWKDWObjectIdVZLOOVRUWLQURXJKO\LQVHUWLRQRUGHU7KLVLVQRWDVWURQJJXDUDQWHHEXWGRHVKDYHVRPHQLFHSURSHUWLHVVXFKDVPDNLQJObjectIdVHIILFLHQWWRLQGH[
,QWKHVHIRXUE\WHVH[LVWVDQLPSOLFLWWLPHVWDPSRIZKHQHDFKGRFXPHQWZDVFUHDWHG 0RVW GULYHUV H[SRVH D PHWKRG IRU H[WUDFWLQJ WKLV LQIRUPDWLRQ IURP DQObjectId
%HFDXVHWKHFXUUHQWWLPHLVXVHGLQObjectIdVVRPHXVHUVZRUU\WKDWWKHLUVHUYHUVZLOOQHHGWRKDYHV\QFKURQL]HGFORFNV7KLVLVQRWQHFHVVDU\EHFDXVHWKHDFWXDOYDOXHRIWKHWLPHVWDPSGRHVQWPDWWHURQO\WKDWLWLVRIWHQQHZRQFHSHUVHFRQGDQGLQFUHDVLQJ
7KHQH[WWKUHHE\WHVRIDQObjectIdDUHDXQLTXHLGHQWLILHURIWKHPDFKLQHRQZKLFKLWZDVJHQHUDWHG7KLVLVXVXDOO\DKDVKRIWKHPDFKLQHVKRVWQDPH%\LQFOXGLQJWKHVHE\WHVZHJXDUDQWHHWKDWGLIIHUHQWPDFKLQHVZLOOQRWJHQHUDWHFROOLGLQJObjectIdV
Data Types | 21
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
27/48
7RSURYLGHXQLTXHQHVVDPRQJGLIIHUHQWSURFHVVHVJHQHUDWLQJObjectIdVFRQFXUUHQWO\RQDVLQJOHPDFKLQHWKHQH[WWZRE\WHVDUHWDNHQIURPWKHSURFHVVLGHQWLILHU3,'RIWKHObjectIdJHQHUDWLQJSURFHVV
7KHVHILUVWQLQHE\WHVRIDQObjectIdJXDUDQWHHLWVXQLTXHQHVVDFURVVPDFKLQHVDQGSURFHVVHVIRUDVLQJOHVHFRQG7KHODVWWKUHHE\WHVDUHVLPSO\DQLQFUHPHQWLQJFRXQWHU
WKDWLVUHVSRQVLEOHIRUXQLTXHQHVVZLWKLQDVHFRQGLQDVLQJOHSURFHVV7KLVDOORZVIRUXSWRXQLTXHObjectIdVWREHJHQHUDWHGSHUSURFHVVLQDVLQJOHVHFRQG
Autogeneration of _id
$VVWDWHGSUHYLRXVO\LIWKHUHLVQR"_id"NH\SUHVHQWZKHQDGRFXPHQWLVLQVHUWHGRQHZLOOEHDXWRPDWLFDOO\DGGHGWRWKHLQVHUWHGGRFXPHQW7KLVFDQEHKDQGOHGE\WKH0RQJR'%VHUYHUEXWZLOOJHQHUDOO\EHGRQHE\WKHGULYHURQWKHFOLHQWVLGH7KHUHDUHDFRXSOHRIUHDVRQVIRUWKDW
$OWKRXJKObjectIdVDUHGHVLJQHGWREHOLJKWZHLJKWDQGHDV\WRJHQHUDWHWKHUHLV
VWLOOVRPHRYHUKHDGLQYROYHGLQWKHLUJHQHUDWLRQ7KHGHFLVLRQWRJHQHUDWHWKHPRQWKHFOLHQWVLGHUHIOHFWVDQRYHUDOOSKLORVRSK\RI0RQJR'%ZRUNVKRXOGEHSXVKHGRXWRIWKHVHUYHUDQGWRWKHGULYHUVZKHQHYHUSRVVLEOH7KLVSKLORVRSK\UHIOHFWVWKHIDFWWKDWHYHQZLWKVFDODEOHGDWDEDVHVOLNH0RQJR'%LWLVHDVLHUWRVFDOHRXWDWWKHDSSOLFDWLRQOD\HUWKDQDWWKHGDWDEDVHOD\HU0RYLQJZRUNWRWKHFOLHQWVLGHUHGXFHVWKHEXUGHQUHTXLULQJWKHGDWDEDVHWRVFDOH
%\JHQHUDWLQJObjectIdVRQWKHFOLHQWVLGHGULYHUVDUHFDSDEOHRISURYLGLQJULFKHU$3,V WKDQ ZRXOG EH RWKHUZLVH SRVVLEOH )RU H[DPSOH D GULYHU PLJKW KDYH LWVinsertPHWKRGHLWKHUUHWXUQWKHJHQHUDWHG ObjectIdRULQMHFWLWGLUHFWO\LQWRWKHGRFXPHQW WKDW ZDV LQVHUWHG ,I WKH GULYHU DOORZHG WKH VHUYHU WR JHQHUDWH
ObjectIdVWKHQ D VHSDUDWH TXHU\ ZRXOG EHUHTXLUHGWR GHWHUPLQHWKH YDOXH RI"_id"IRUDQLQVHUWHGGRFXPHQW
22 | Chapter 2:Getting Started
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
28/48
CHAPTER 4
Querying
7KLVFKDSWHUORRNVDWTXHU\LQJLQGHWDLO7KHPDLQDUHDVFRYHUHGDUHDVIROORZV
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
29/48
HDV\DVVSHFLI\LQJWKHYDOXHWKDW\RXDUHORRNLQJIRU)RUH[DPSOHWRILQGDOOGRFXPHQWVZKHUHWKHYDOXHIRU"age"LVZHFDQDGGWKDWNH\YDOXHSDLUWRWKHTXHU\GRFXPHQW
> db.users.find({"age" : 27})
,IZHKDYHDVWULQJZHZDQWWRPDWFKVXFKDVD"username"NH\ZLWKWKHYDOXH"joe"ZHXVHWKDWNH\YDOXHSDLULQVWHDG
> db.users.find({"username" : "joe"})
0XOWLSOHFRQGLWLRQVFDQEHVWUXQJWRJHWKHUE\DGGLQJPRUHNH\YDOXHSDLUVWRWKHTXHU\GRFXPHQW ZKLFK JHWV LQWHUSUHWHG DV FRQGLWLRQ $1' FRQGLWLRQ $1' $1'FRQGLWLRQ1)RULQVWDQFHWRJHWDOOXVHUVZKRDUH\HDUROGVZLWKWKHXVHUQDPHMRHZHFDQTXHU\IRUWKHIROORZLQJ
> db.users.find({"username" : "joe", "age" : 27})
Specifying Which Keys to Return
6RPHWLPHV\RXGRQRWQHHGDOORIWKHNH\YDOXHSDLUVLQDGRFXPHQWUHWXUQHG,IWKLVLVWKHFDVH\RXFDQSDVVDVHFRQGDUJXPHQWWRfindRUfindOneVSHFLI\LQJWKHNH\V\RXZDQW7KLVUHGXFHVERWKWKHDPRXQWRIGDWDVHQWRYHUWKHZLUHDQGWKHWLPHDQGPHPRU\XVHGWRGHFRGHGRFXPHQWVRQWKHFOLHQWVLGH
)RUH[DPSOHLI\RXKDYHDXVHUFROOHFWLRQDQG\RXDUHLQWHUHVWHGRQO\LQWKH"username"DQG"email"NH\V\RXFRXOGUHWXUQMXVWWKRVHNH\VZLWKWKHIROORZLQJTXHU\
> db.users.find({}, {"username" : 1, "email" : 1}){
"_id" : ObjectId("4ba0f0dfd22aa494fd523620"),"username" : "joe","email" : "joe@example.com"
}
$V\RXFDQVHHIURPWKHSUHYLRXVRXWSXWWKH"_id"NH\LVDOZD\VUHWXUQHGHYHQLILWLVQWVSHFLILFDOO\OLVWHG
db.users.find({}, {"fatal_weakness" : 0})
7KLVFDQHYHQSUHYHQW"_id"IURPEHLQJUHWXUQHG
> db.users.find({}, {"username" : 1, "_id" : 0}){"username" : "joe",
}
46 | Chapter 4:Querying
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
30/48
Limitations7KHUHDUHVRPHUHVWULFWLRQVRQTXHULHV7KHYDOXHRIDTXHU\GRFXPHQWPXVWEHDFRQVWDQWDVIDUDVWKHGDWDEDVHLVFRQFHUQHG,WFDQEHDQRUPDOYDULDEOHLQ\RXURZQFRGH7KDWLVLWFDQQRWUHIHUWRWKHYDOXHRIDQRWKHUNH\LQWKHGRFXPHQW)RUH[DPSOHLIZHZHUHNHHSLQJLQYHQWRU\DQGZHKDGERWK"in_stock"DQG"num_sold"NH\VZHFRXOGFRPSDUHWKHLUYDOXHVE\TXHU\LQJWKHIROORZLQJ
> db.stock.find({"in_stock" : "this.num_sold"}) // doesn't work
7KHUHDUHZD\VWRGRWKLVVHHZKHUH4XHULHVRQSDJHEXW\RXZLOOXVXDOO\JHWEHWWHUSHUIRUPDQFHE\UHVWUXFWXULQJ\RXUGRFXPHQWVOLJKWO\VXFKWKDWDQRUPDOTXHU\ZLOO VXIILFH ,Q WKLV H[DPSOH ZH FRXOG LQVWHDG XVH WKH NH\V "initial_stock" DQG"in_stock"7KHQHYHU\WLPHVRPHRQHEX\VDQLWHPZHGHFUHPHQWWKHYDOXHRIWKH"in_stock"NH\E\RQH)LQDOO\ZHFDQGRDVLPSOHTXHU\WRFKHFNZKLFKLWHPVDUHRXWRIVWRFN
> db.stock.find({"in_stock" : 0})
Query Criteria4XHULHVFDQJREH\RQGWKHH[DFWPDWFKLQJGHVFULEHGLQWKHSUHYLRXVVHFWLRQWKH\FDQPDWFKPRUHFRPSOH[FULWHULDVXFKDVUDQJHV25FODXVHVDQGQHJDWLRQ
Query Conditionals"$lt""$lte""$gt"DQG"$gte"DUHDOOFRPSDULVRQRSHUDWRUVFRUUHVSRQGLQJWR!DQG!UHVSHFWLYHO\7KH\FDQEHFRPELQHGWRORRNIRUDUDQJHRIYDOXHV)RUH[
DPSOHWRORRNIRUXVHUVZKRDUHEHWZHHQWKHDJHVRIDQGLQFOXVLYHZHFDQGRWKLV> db.users.find({"age" : {"$gte" : 18, "$lte" : 30}})
7KHVHW\SHVRIUDQJHTXHULHVDUHRIWHQXVHIXOIRUGDWHV)RUH[DPSOHWRILQGSHRSOHZKRUHJLVWHUHGEHIRUH-DQXDU\ZHFDQGRWKLV
> start = new Date("01/01/2007")> db.users.find({"registered" : {"$lt" : start}})
$QH[DFWPDWFKRQDGDWHLVOHVVXVHIXOEHFDXVHGDWHVDUHRQO\VWRUHGZLWKPLOOLVHFRQGSUHFLVLRQ 2IWHQ \RX ZDQW D ZKROH GD\ ZHHN RU PRQWK PDNLQJ D UDQJH TXHU\QHFHVVDU\
7RTXHU\IRUGRFXPHQWVZKHUHDNH\VYDOXHLVQRWHTXDOWRDFHUWDLQYDOXH\RXPXVWXVHDQRWKHUFRQGLWLRQDORSHUDWRU"$ne"ZKLFKVWDQGVIRUQRWHTXDO,I\RXZDQWWRILQGDOOXVHUVZKRGRQRWKDYHWKHXVHUQDPHMRH\RXFDQTXHU\IRUWKHPXVLQJWKLV
> db.users.find({"username" : {"$ne" : "joe"}})
"$ne"FDQEHXVHGZLWKDQ\W\SH
Query Criteria | 47
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
31/48
OR Queries7KHUHDUHWZRZD\VWRGRDQ25TXHU\LQ0RQJR'%"$in"FDQEHXVHGWRTXHU\IRUDYDULHW\RIYDOXHVIRUDVLQJOHNH\"$or"LVPRUHJHQHUDOLWFDQEHXVHGWRTXHU\IRUDQ\RIWKHJLYHQYDOXHVDFURVVPXOWLSOHNH\V
,I\RXKDYHPRUHWKDQRQHSRVVLEOHYDOXHWRPDWFKIRUDVLQJOHNH\XVHDQDUUD\RIFULWHULDZLWK"$in")RULQVWDQFHVXSSRVHZHZHUHUXQQLQJDUDIIOHDQGWKHZLQQLQJWLFNHWQXPEHUVZHUHDQG7RILQGDOOWKUHHRIWKHVHGRFXPHQWVZHFDQFRQVWUXFWWKHIROORZLQJTXHU\
> db.raffle.find({"ticket_no" : {"$in" : [725, 542, 390]}})
"$in"LVYHU\IOH[LEOHDQGDOORZV\RXWRVSHFLI\FULWHULDRIGLIIHUHQWW\SHVDVZHOODVYDOXHV)RUH[DPSOHLIZHDUHJUDGXDOO\PLJUDWLQJRXUVFKHPDWRXVHXVHUQDPHVLQVWHDGRIXVHU,'QXPEHUVZHFDQTXHU\IRUHLWKHUE\XVLQJWKLV
> db.users.find({"user_id" : {"$in" : [12345, "joe"]})
7KLVPDWFKHVGRFXPHQWVZLWKD"user_id"HTXDOWRDQGGRFXPHQWVZLWKD"user_id"HTXDOWR"joe"
,I"$in"LVJLYHQDQDUUD\ZLWKDVLQJOHYDOXHLWEHKDYHVWKHVDPHDVGLUHFWO\PDWFKLQJWKHYDOXH)RULQVWDQFH{ticket_no : {$in : [725]}}PDWFKHVWKHVDPHGRFXPHQWVDV{ticket_no : 725}
7KHRSSRVLWHRI"$in"LV"$nin"ZKLFKUHWXUQVGRFXPHQWVWKDWGRQWPDWFKDQ\RIWKHFULWHULDLQWKHDUUD\,IZHZDQWWRUHWXUQDOORIWKHSHRSOHZKRGLGQWZLQDQ\WKLQJLQWKHUDIIOHZHFDQTXHU\IRUWKHPZLWKWKLV
> db.raffle.find({"ticket_no" : {"$nin" : [725, 542, 390]}})
7KLVTXHU\UHWXUQVHYHU\RQHZKRGLGQRWKDYHWLFNHWVZLWKWKRVHQXPEHUV
"$in"JLYHV\RXDQ25TXHU\IRUDVLQJOHNH\EXWZKDWLIZHQHHGWRILQGGRFXPHQWVZKHUH"ticket_no"LVRU"winner"LVtrue")RUWKLVW\SHRITXHU\ZHOOQHHGWRXVHWKH"$or"FRQGLWLRQDO"$or"WDNHVDQDUUD\RISRVVLEOHFULWHULD,QWKHUDIIOHFDVHXVLQJ"$or"ZRXOGORRNOLNHWKLV
> db.raffle.find({"$or" : [{"ticket_no" : 725}, {"winner" : true}]})
"$or"FDQFRQWDLQRWKHUFRQGLWLRQDOV,IIRUH[DPSOHZHZDQWWRPDWFKDQ\RIWKHWKUHH"ticket_no"YDOXHVRUWKH"winner"NH\ZHFDQXVHWKLV
> db.raffle.find({"$or" : [{"ticket_no" : {"$in" : [725, 542, 390]}},
{"winner" : true}]})
:LWKDQRUPDO$1'W\SHTXHU\\RXZDQWWRQDUURZ\RXUUHVXOWVGRZQDVIDUDVSRVVLEOHLQDVIHZDUJXPHQWVDVSRVVLEOH25W\SHTXHULHVDUHWKHRSSRVLWHWKH\DUHPRVWHIILFLHQWLIWKHILUVWDUJXPHQWVPDWFKDVPDQ\GRFXPHQWVDVSRVVLEOH
48 | Chapter 4:Querying
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
32/48
$not"$not"LVDPHWDFRQGLWLRQDOLWFDQEHDSSOLHGRQWRSRIDQ\RWKHUFULWHULD$VDQH[DPSOHOHWVFRQVLGHUWKHPRGXOXVRSHUDWRU"$mod""$mod"TXHULHVIRUNH\VZKRVHYDOXHVZKHQGLYLGHGE\WKHILUVWYDOXHJLYHQKDYHDUHPDLQGHURIWKHVHFRQGYDOXH
> db.users.find({"id_num" : {"$mod" : [5, 1]}})7KHSUHYLRXVTXHU\UHWXUQVXVHUVZLWK"id_num"VRIDQGVRRQ,IZHZDQWLQVWHDGWRUHWXUQXVHUVZLWK"id_num"VRIDQGVRRQZHFDQXVH"$not"
> db.users.find({"id_num" : {"$not" : {"$mod" : [5, 1]}}})
"$not"FDQEHSDUWLFXODUO\XVHIXOLQFRQMXQFWLRQZLWKUHJXODUH[SUHVVLRQVWRILQGDOOGRFXPHQWVWKDWGRQWPDWFKDJLYHQSDWWHUQUHJXODUH[SUHVVLRQXVDJHLVGHVFULEHGLQWKHVHFWLRQ5HJXODU([SUHVVLRQVRQSDJH
Rules for Conditionals,I\RXORRNDWWKHXSGDWHPRGLILHUVLQWKHSUHYLRXVFKDSWHUDQGSUHYLRXVTXHU\GRFXPHQWV\RXOOQRWLFHWKDWWKHSUHIL[HGNH\VDUHLQGLIIHUHQWSRVLWLRQV,QWKHTXHU\"$lt"LVLQWKHLQQHUGRFXPHQWLQWKHXSGDWH"$inc"LVWKHNH\IRUWKHRXWHUGRFXPHQW7KLVJHQHUDOO\KROGVWUXHFRQGLWLRQDOVDUHDQLQQHUGRFXPHQWNH\DQGPRGLILHUVDUHDOZD\VDNH\LQWKHRXWHUGRFXPHQW
0XOWLSOHFRQGLWLRQVFDQEHSXWRQDVLQJOHNH\)RUH[DPSOHWRILQGDOOXVHUVEHWZHHQWKHDJHVRIDQGZHFDQTXHU\IRUERWK"$gt"DQG"$lt"RQWKH"age"NH\
> db.users.find({"age" : {"$lt" : 30, "$gt" : 20}})
$Q\QXPEHURIFRQGLWLRQDOVFDQEHXVHGZLWKDVLQJOHNH\0XOWLSOHXSGDWHPRGLILHUVFDQQRWEHXVHGRQD VLQJOHNH\KRZHYHU)RUH[DPSOH\RXFDQQRWKDYHDPRGLILHUGRFXPHQW VXFK DV {"$inc" : {"age" : 1}, "$set" : {age : 40}} EHFDXVH LWPRGLILHV"age"WZLFH:LWKTXHU\FRQGLWLRQDOVQRVXFKUXOHDSSOLHV
Type-Specific Queries$VFRYHUHGLQ&KDSWHU0RQJR'%KDVDZLGHYDULHW\RIW\SHVWKDWFDQEHXVHGLQDGRFXPHQW6RPHRIWKHVHEHKDYHVSHFLDOO\LQTXHULHV
nullnullEHKDYHVDELWVWUDQJHO\,WGRHVPDWFKLWVHOIVRLIZHKDYHDFROOHFWLRQZLWKWKHIROORZLQJGRFXPHQWV
> db.c.find(){ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }
Type-Specific Queries | 49
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
33/48
{ "_id" : ObjectId("4ba0f0dfd22aa494fd523622"), "y" : 1 }{ "_id" : ObjectId("4ba0f148d22aa494fd523623"), "y" : 2 }
ZHFDQTXHU\IRUGRFXPHQWVZKRVH"y"NH\LVnullLQWKHH[SHFWHGZD\
> db.c.find({"y" : null}){ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }
+RZHYHUnullQRWRQO\PDWFKHVLWVHOIEXWDOVRPDWFKHVGRHVQRWH[LVW7KXVTXHU\LQJIRUDNH\ZLWKWKHYDOXHnullZLOOUHWXUQDOOGRFXPHQWVODFNLQJWKDWNH\
> db.c.find({"z" : null}){ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }{ "_id" : ObjectId("4ba0f0dfd22aa494fd523622"), "y" : 1 }{ "_id" : ObjectId("4ba0f148d22aa494fd523623"), "y" : 2 }
,IZHRQO\ZDQWWRILQGNH\VZKRVHYDOXHLVnullZHFDQFKHFNWKDWWKHNH\LVnullDQGH[LVWVXVLQJWKH"$exists"FRQGLWLRQDO
> db.c.find({"z" : {"$in" : [null], "$exists" : true}})
8QIRUWXQDWHO\ WKHUH LV QR"$eq" RSHUDWRUZKLFK PDNHV WKLV D OLWWOH DZNZDUG EXW"$in"ZLWKRQHHOHPHQWLVHTXLYDOHQW
Regular Expressions5HJXODUH[SUHVVLRQVDUHXVHIXOIRUIOH[LEOHVWULQJPDWFKLQJ)RUH[DPSOHLIZHZDQWWRILQGDOOXVHUVZLWKWKHQDPH-RHRU MRHZHFDQXVHDUHJXODUH[SUHVVLRQWRGRFDVHLQVHQVLWLYHPDWFKLQJ
> db.users.find({"name" : /joe/i})
5HJXODUH[SUHVVLRQIODJViDUHDOORZHGEXWQRWUHTXLUHG,IZHZDQWWRPDWFKQRWRQO\
YDULRXVFDSLWDOL]DWLRQVRIMRHEXWDOVRMRH\ZHFDQFRQWLQXHWRLPSURYHRXUUHJXODUH[SUHVVLRQ
> db.users.find({"name" : /joey?/i})
0RQJR'%XVHVWKH3HUO&RPSDWLEOH5HJXODU([SUHVVLRQ3&5(OLEUDU\WRPDWFKUHJXODU H[SUHVVLRQV DQ\ UHJXODU H[SUHVVLRQ V\QWD[ DOORZHG E\ 3&5( LV DOORZHG LQ0RQJR'%,WLVDJRRGLGHDWRFKHFN\RXUV\QWD[ZLWKWKH-DYD6FULSWVKHOOEHIRUHXVLQJLWLQDTXHU\WRPDNHVXUHLWPDWFKHVZKDW\RXWKLQNLWPDWFKHV
0RQJR'%FDQOHYHUDJHDQLQGH[IRUTXHULHVRQSUHIL[UHJXODUH[SUHV
VLRQVHJ/^joey/VRTXHULHVRIWKDWNLQGFDQEHIDVW
5HJXODUH[SUHVVLRQVFDQDOVRPDWFKWKHPVHOYHV9HU\IHZSHRSOHLQVHUWUHJXODUH[SUHVVLRQVLQWRWKHGDWDEDVHEXWLI\RXLQVHUWRQH\RXFDQPDWFKLWZLWKLWVHOI
> db.foo.insert({"bar" : /baz/})> db.foo.find({"bar" : /baz/})
50 | Chapter 4:Querying
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
34/48
{"_id" : ObjectId("4b23c3ca7525f35f94b60a2d"),"bar" : /baz/
}
Querying Arrays4XHU\LQJIRUHOHPHQWVRIDQDUUD\LVVLPSOH$QDUUD\FDQPRVWO\EHWUHDWHGDVWKRXJKHDFKHOHPHQWLVWKHYDOXHRIWKHRYHUDOONH\)RUH[DPSOHLIWKHDUUD\LVDOLVWRIIUXLWVOLNHWKLV
> db.food.insert({"fruit" : ["apple", "banana", "peach"]})
WKHIROORZLQJTXHU\
> db.food.find({"fruit" : "banana"})
ZLOOVXFFHVVIXOO\PDWFKWKHGRFXPHQW:HFDQTXHU\IRULWLQPXFKWKHVDPHZD\DVWKRXJKZHKDGDGRFXPHQWWKDWORRNHGOLNHWKHLOOHJDOGRFXPHQW{"fruit" : "apple",
"fruit" : "banana", "fruit" : "peach"}
$all
,I\RXQHHGWRPDWFKDUUD\VE\PRUHWKDQRQHHOHPHQW\RXFDQXVH "$all"7KLVDOORZV\RXWRPDWFKDOLVWRIHOHPHQWV)RUH[DPSOHVXSSRVHZHFUHDWHGDFROOHFWLRQZLWKWKUHHHOHPHQWV
> db.food.insert({"_id" : 1, "fruit" : ["apple", "banana", "peach"]})> db.food.insert({"_id" : 2, "fruit" : ["apple", "kumquat", "orange"]})> db.food.insert({"_id" : 3, "fruit" : ["cherry", "banana", "apple"]})
7KHQZHFDQILQGDOOGRFXPHQWVZLWKERWK"apple"DQG"banana"HOHPHQWVE\TXHU\LQJ
ZLWK"$all"
> db.food.find({fruit : {$all : ["apple", "banana"]}}){"_id" : 1, "fruit" : ["apple", "banana", "peach"]}{"_id" : 3, "fruit" : ["cherry", "banana", "apple"]}
2UGHUGRHVQRWPDWWHU1RWLFH "banana"FRPHVEHIRUH"apple"LQWKHVHFRQGUHVXOW8VLQJDRQHHOHPHQWDUUD\ZLWK"$all"LVHTXLYDOHQWWRQRWXVLQJ"$all")RULQVWDQFH{fruit : {$all : ['apple']}ZLOOPDWFKWKHVDPHGRFXPHQWVDV{fruit : 'apple'}
db.food.find({"fruit" : ["apple", "banana", "peach"]})
%XWWKLVZLOOQRW
> db.food.find({"fruit" : ["apple", "banana"]})
DQGQHLWKHUZLOOWKLV
> db.food.find({"fruit" : ["banana", "apple", "peach"]})
Type-Specific Queries | 51
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
35/48
,I\RXZDQWWRTXHU\IRUDVSHFLILFHOHPHQWRIDQDUUD\\RXFDQVSHFLI\DQLQGH[XVLQJWKHV\QWD[keyindex
> db.food.find({"fruit.2" : "peach"})
$UUD\VDUHDOZD\VLQGH[HGVRWKLVZRXOGPDWFKWKHWKLUGDUUD\HOHPHQWDJDLQVWWKHVWULQJ"peach"
$size
$XVHIXOFRQGLWLRQDOIRUTXHU\LQJDUUD\VLV"$size"ZKLFKDOORZV\RXWRTXHU\IRUDUUD\VRIDJLYHQVL]H+HUHVDQH[DPSOH
> db.food.find({"fruit" : {"$size" : 3}})
2QHFRPPRQTXHU\LVWRJHWDUDQJHRIVL]HV"$size"FDQQRWEHFRPELQHGZLWKDQRWKHUFRQGLWLRQDOLQWKLVH[DPSOH "$gt"EXWWKLVTXHU\FDQEHDFFRPSOLVKHGE\DGGLQJD"size"NH\WRWKHGRFXPHQW7KHQHYHU\WLPH\RXDGGDQHOHPHQWWRWKHDUUD\LQFUHPHQWWKHYDOXHRI"size",IWKHRULJLQDOXSGDWHORRNHGOLNHWKLV
> db.food.update({"$push" : {"fruit" : "strawberry"}})
LWFDQVLPSO\EHFKDQJHGWRWKLV
> db.food.update({"$push" : {"fruit" : "strawberry"}, "$inc" : {"size" : 1}})
,QFUHPHQWLQJLVH[WUHPHO\IDVWVRDQ\SHUIRUPDQFHSHQDOW\LVQHJOLJLEOH6WRULQJGRFXPHQWVOLNHWKLVDOORZV\RXWRGRTXHULHVVXFKDVWKLV
> db.food.find({"size" : {"$gt" : 3}})
8QIRUWXQDWHO\WKLVWHFKQLTXHGRHVQWZRUNDVZHOOZLWKWKH"$addToSet"RSHUDWRU
The $slice operator$VPHQWLRQHGHDUOLHULQWKLVFKDSWHUWKHRSWLRQDOVHFRQGDUJXPHQWWRfindVSHFLILHVWKHNH\VWREHUHWXUQHG7KHVSHFLDO"$slice"RSHUDWRUFDQEHXVHGWRUHWXUQDVXEVHWRIHOHPHQWVIRUDQDUUD\NH\
)RUH[DPSOHVXSSRVHZHKDGDEORJSRVWGRFXPHQWDQGZHZDQWHGWRUHWXUQWKHILUVWFRPPHQWV
> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : 10}})
$OWHUQDWLYHO\LIZHZDQWHGWKHODVWFRPPHQWVZHFRXOGXVH
> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : -10}})
"$slice"FDQDOVRUHWXUQSDJHVLQWKHPLGGOHRIWKHUHVXOWVE\WDNLQJDQRIIVHWDQGWKHQXPEHURIHOHPHQWVWRUHWXUQ
> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : [23, 10]}})
7KLVZRXOGVNLSWKHILUVWHOHPHQWVDQGUHWXUQWKHWKWKURXJKWK,IWKHUHDUHIHZHUWKDQHOHPHQWVLQWKHDUUD\LWZLOOUHWXUQDVPDQ\DVSRVVLEOH
52 | Chapter 4:Querying
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
36/48
8QOHVVRWKHUZLVHVSHFLILHGDOONH\VLQDGRFXPHQWDUHUHWXUQHGZKHQ"$slice"LVXVHG7KLVLVXQOLNHWKHRWKHUNH\VSHFLILHUVZKLFKVXSSUHVVXQPHQWLRQHGNH\VIURPEHLQJUHWXUQHG)RULQVWDQFHLIZHKDGDEORJSRVWGRFXPHQWWKDWORRNHGOLNHWKLV
{"_id" : ObjectId("4b2d75476cc613d5ee930164"),"title" : "A blog post","content" : "...","comments" : [
{"name" : "joe","email" : "joe@example.com","content" : "nice post."
},{
"name" : "bob","email" : "bob@example.com","content" : "good post."
}]
}
DQGZHGLGD"$slice"WRJHWWKHODVWFRPPHQWZHGJHWWKLV
> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : -1}}){
"_id" : ObjectId("4b2d75476cc613d5ee930164"),"title" : "A blog post","content" : "...","comments" : [
{"name" : "bob","email" : "bob@example.com",
"content" : "good post."}]
}
%RWK"title"DQG"content"DUHVWLOOUHWXUQHGHYHQWKRXJKWKH\ZHUHQWH[SOLFLWO\LQFOXGHGLQWKHNH\VSHFLILHU
Querying on Embedded Documents7KHUHDUHWZRZD\VRITXHU\LQJIRUDQHPEHGGHGGRFXPHQWTXHU\LQJIRUWKHZKROHGRFXPHQWRUTXHU\LQJIRULWVLQGLYLGXDONH\YDOXHSDLUV
4XHU\LQJIRUDQHQWLUHHPEHGGHGGRFXPHQWZRUNVLGHQWLFDOO\WRDQRUPDOTXHU\)RUH[DPSOHLIZHKDYHDGRFXPHQWWKDWORRNVOLNHWKLV
{"name" : {
"first" : "Joe","last" : "Schmoe"
},
Type-Specific Queries | 53
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
37/48
"age" : 45}
ZHFDQTXHU\IRUVRPHRQHQDPHG-RH6FKPRHZLWKWKHIROORZLQJ
> db.people.find({"name" : {"first" : "Joe", "last" : "Schmoe"}})
+RZHYHULI-RHGHFLGHVWRDGGDPLGGOHQDPHNH\VXGGHQO\WKLVTXHU\ZRQWZRUNDQ\PRUHLWGRHVQWPDWFKWKHHQWLUHHPEHGGHGGRFXPHQW7KLVW\SHRITXHU\LVDOVRRUGHUVHQVLWLYH{"last" : "Schmoe", "first" : "Joe"}ZRXOGQRWEHDPDWFK
,ISRVVLEOHLWVXVXDOO\DJRRGLGHDWRTXHU\IRUMXVWDVSHFLILFNH\RUNH\VRIDQHPEHGGHGGRFXPHQW7KHQLI\RXUVFKHPDFKDQJHVDOORI\RXUTXHULHVZRQWVXGGHQO\EUHDNEHFDXVHWKH\UHQRORQJHUH[DFWPDWFKHV db.people.find({"name.first" : "Joe", "name.last" : "Schmoe"})
1RZLI-RHDGGVPRUHNH\VWKLVTXHU\ZLOOVWLOOPDWFKKLVILUVWDQGODVWQDPHV
7KLVGRWQRWDWLRQLVWKHPDLQGLIIHUHQFHEHWZHHQTXHU\GRFXPHQWVDQGRWKHUGRFXPHQWW\SHV 4XHU\ GRFXPHQWV FDQ FRQWDLQ GRWV ZKLFK PHDQ UHDFK LQWR DQ HPEHGGHGGRFXPHQW'RWQRWDWLRQLVDOVRWKHUHDVRQWKDWGRFXPHQWVWREHLQVHUWHGFDQQRWFRQWDLQWKHFKDUDFWHU2IWHQWLPHVSHRSOHUXQLQWRWKLVOLPLWDWLRQZKHQWU\LQJWRVDYH85/VDVNH\V2QHZD\WRJHWDURXQGLWLVWRDOZD\VSHUIRUPDJOREDOUHSODFHEHIRUHLQVHUWLQJRU DIWHU UHWULHYLQJ VXEVWLWXWLQJ D FKDUDFWHU WKDW LVQW OHJDO LQ 85/V IRU WKH GRW FKDUDFWHU
(PEHGGHGGRFXPHQWPDWFKHVFDQJHWDOLWWOHWULFN\DVWKHGRFXPHQWVWUXFWXUHJHWVPRUHFRPSOLFDWHG)RUH[DPSOHVXSSRVHZHDUHVWRULQJEORJSRVWVDQGZHZDQWWRILQGFRPPHQWVE\-RHWKDWZHUHVFRUHGDWOHDVWDILYH:HFRXOGPRGHOWKHSRVWDVIROORZV
> db.blog.find(){
"content" : "...","comments" : [
{"author" : "joe","score" : 3,"comment" : "nice post"
},{
"author" : "mary","score" : 6,"comment" : "terrible post"
}]
}
1RZZHFDQWTXHU\XVLQJdb.blog.find({"comments" : {"author" : "joe", "score" :{"$gte" : 5}}})(PEHGGHGGRFXPHQWPDWFKHVKDYHWRPDWFKWKHZKROHGRFXPHQWDQG WKLV GRHVQW PDWFK WKH "comment" NH\ ,W DOVR ZRXOGQW ZRUN WR GRdb.blog.find({"comments.author" : "joe", "comments.score" : {"$gte" : 5}})
54 | Chapter 4:Querying
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
38/48
EHFDXVHWKHDXWKRUFULWHULDFRXOGPDWFKDGLIIHUHQWFRPPHQWWKDQWKHVFRUHFULWHULD7KDW LV LW ZRXOG UHWXUQ WKH GRFXPHQW VKRZQ HDUOLHU LW ZRXOG PDWFK "author" :"joe"LQWKHILUVWFRPPHQWDQG"score" : 6LQWKHVHFRQGFRPPHQW
7RFRUUHFWO\JURXSFULWHULDZLWKRXWQHHGLQJWRVSHFLI\HYHU\NH\XVH"$elemMatch"7KLVYDJXHO\QDPHGFRQGLWLRQDODOORZV\RXWRSDUWLDOO\VSHFLI\FULWHULDWRPDWFKDVLQJOH
HPEHGGHGGRFXPHQWLQDQDUUD\7KHFRUUHFWTXHU\ORRNVOLNHWKLV> db.blog.find({"comments" : {"$elemMatch" : {"author" : "joe",
"score" : {"$gte" : 5}}}})
"$elemMatch"DOORZVXVWRJURXSRXUFULWHULD$VVXFKLWVRQO\QHHGHGZKHQ\RXKDYHPRUHWKDQRQHNH\\RXZDQWWRPDWFKRQLQDQHPEHGGHGGRFXPHQW
$where Queries.H\YDOXHSDLUVDUHDIDLUO\H[SUHVVLYHZD\WRTXHU\EXWWKHUHDUHVRPHTXHULHVWKDW
WKH\ FDQQRW UHSUHVHQW )RU TXHULHV WKDW FDQQRW EH GRQH DQ\ RWKHU ZD\ WKHUH DUH"$where"FODXVHVZKLFKDOORZ\RXWRH[HFXWHDUELWUDU\-DYD6FULSWDVSDUWRI\RXUTXHU\7KLVDOORZV\RXWRGRDOPRVWDQ\WKLQJZLWKLQDTXHU\
7KHPRVWFRPPRQFDVHIRUWKLVLVZDQWLQJWRFRPSDUHWKHYDOXHVIRUWZRNH\VLQDGRFXPHQWIRULQVWDQFHLIZHKDGDOLVWRILWHPVDQGZDQWHGWRUHWXUQGRFXPHQWVZKHUHDQ\WZRRIWKHYDOXHVDUHHTXDO+HUHVDQH[DPSOH
> db.foo.insert({"apple" : 1, "banana" : 6, "peach" : 3})> db.foo.insert({"apple" : 8, "spinach" : 4, "watermelon" : 4})
,QWKHVHFRQGGRFXPHQW"spinach"DQG"watermelon"KDYHWKHVDPHYDOXHVRZHGOLNHWKDWGRFXPHQWUHWXUQHG,WVXQOLNHO\0RQJR'%ZLOOHYHUKDYHDFRQGLWLRQDOIRUWKLV
VRZHFDQXVHD"$where"FODXVHWRGRLWZLWK-DYD6FULSW
> db.foo.find({"$where" : function () {... for (var current in this) {... for (var other in this) {... if (current != other && this[current] == this[other]) {... return true;... }... }... }... return false;... }});
,IWKHIXQFWLRQUHWXUQVtrueWKHGRFXPHQWZLOOEHSDUWRIWKHUHVXOWVHWLILWUHWXUQVfalseLWZRQWEH
:HXVHGDIXQFWLRQHDUOLHUEXW\RXFDQDOVRXVHVWULQJVWRVSHFLI\D "$where"TXHU\WKHIROORZLQJWZR"$where"TXHULHVDUHHTXLYDOHQW
> db.foo.find({"$where" : "this.x + this.y == 10"})> db.foo.find({"$where" : "function() { return this.x + this.y == 10; }"})
$where Queries | 55
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
39/48
"$where"TXHULHVVKRXOGQRWEHXVHGXQOHVVVWULFWO\QHFHVVDU\WKH\DUHPXFKVORZHUWKDQUHJXODUTXHULHV(DFKGRFXPHQWKDVWREHFRQYHUWHGIURP%621WRD-DYD6FULSWREMHFWDQGWKHQUXQWKURXJKWKH"$where"H[SUHVVLRQ,QGH[HVFDQQRWEHXVHGWRVDWLVI\D"$where"HLWKHU+HQFH\RXVKRXOGXVH"$where"RQO\ZKHQWKHUHLVQRRWKHUZD\RIGRLQJWKHTXHU\
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
40/48
> var cursor = db.people.find();> cursor.forEach(function(x) {... print(x.name);... });adammattzak
:KHQ\RXFDOOfindWKHVKHOOGRHVQRWTXHU\WKHGDWDEDVHLPPHGLDWHO\,WZDLWVXQWLO\RXDFWXDOO\VWDUWUHTXHVWLQJUHVXOWVWRVHQGWKHTXHU\ZKLFKDOORZV\RXWRFKDLQDGGLWLRQDORSWLRQVRQWRDTXHU\EHIRUHLWLVSHUIRUPHG$OPRVWHYHU\PHWKRGRQDFXUVRUREMHFWUHWXUQVWKHFXUVRULWVHOIVRWKDW\RXFDQFKDLQWKHPLQDQ\RUGHU)RULQVWDQFHDOORIWKHIROORZLQJDUHHTXLYDOHQW
> var cursor = db.foo.find().sort({"x" : 1}).limit(1).skip(10);> var cursor = db.foo.find().limit(1).sort({"x" : 1}).skip(10);> var cursor = db.foo.find().skip(10).limit(1).sort({"x" : 1});
$WWKLVSRLQWWKHTXHU\KDVQRWEHHQH[HFXWHG\HW$OORIWKHVHIXQFWLRQVPHUHO\EXLOG
WKHTXHU\1RZVXSSRVHZHFDOOWKHIROORZLQJ> cursor.hasNext()
$WWKLVSRLQWWKHTXHU\ZLOOEHVHQWWRWKHVHUYHU7KHVKHOOIHWFKHVWKHILUVWUHVXOWVRUILUVW0%RIUHVXOWVZKLFKHYHULVVPDOOHUDWRQFHVRWKDWWKHQH[WFDOOVWRnextRUhasNextZLOOQRWKDYHWRPDNHWULSVWRWKHVHUYHU$IWHUWKHFOLHQWKDVUXQWKURXJKWKHILUVWVHWRIUHVXOWVWKHVKHOOZLOODJDLQFRQWDFWWKHGDWDEDVHDQGDVNIRUPRUHUHVXOWV7KLVSURFHVVFRQWLQXHVXQWLOWKHFXUVRULVH[KDXVWHGDQGDOOUHVXOWVKDYHEHHQUHWXUQHG
Limits, Skips, and Sorts
7KHPRVWFRPPRQTXHU\RSWLRQVDUHOLPLWLQJWKHQXPEHURIUHVXOWVUHWXUQHGVNLSSLQJDQXPEHURIUHVXOWVDQGVRUWLQJ$OORIWKHVHRSWLRQVPXVWEHDGGHGEHIRUHDTXHU\LVVHQWWRWKHGDWDEDVH
7RVHWDOLPLWFKDLQWKH limitIXQFWLRQRQWR\RXUFDOOWR find)RUH[DPSOHWRRQO\UHWXUQWKUHHUHVXOWVXVHWKLV
> db.c.find().limit(3)
,IWKHUHDUHIHZHUWKDQWKUHHGRFXPHQWVPDWFKLQJ\RXUTXHU\LQWKHFROOHFWLRQRQO\WKHQXPEHURIPDWFKLQJGRFXPHQWVZLOOEHUHWXUQHGlimitVHWVDQXSSHUOLPLWQRWDORZHUOLPLW
skipZRUNVVLPLODUO\WRlimit> db.c.find().skip(3)
7KLVZLOOVNLSWKHILUVWWKUHHPDWFKLQJGRFXPHQWVDQGUHWXUQWKHUHVWRIWKHPDWFKHV,IWKHUHDUHOHVVWKDQWKUHHGRFXPHQWVLQ\RXUFROOHFWLRQLWZLOOQRWUHWXUQDQ\GRFXPHQWV
sort WDNHVDQREMHFWDVHWRINH\YDOXHSDLUVZKHUHWKHNH\VDUHNH\QDPHVDQGWKHYDOXHVDUHWKHVRUWGLUHFWLRQV6RUWGLUHFWLRQFDQEHDVFHQGLQJRUGHVFHQGLQJ,I
Cursors | 57
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
41/48
PXOWLSOHNH\VDUHJLYHQWKHUHVXOWVZLOOEHVRUWHGLQWKDWRUGHU)RULQVWDQFHWRVRUWWKHUHVXOWVE\"username"DVFHQGLQJDQG"age"GHVFHQGLQJZHGRWKHIROORZLQJ
> db.c.find().sort({username : 1, age : -1})
7KHVHWKUHHPHWKRGVFDQEHFRPELQHG7KLVLVRIWHQKDQG\IRUSDJLQDWLRQ)RUH[DPSOHVXSSRVHWKDW\RXDUHUXQQLQJDQRQOLQHVWRUHDQGVRPHRQHVHDUFKHVIRU PS,I\RX
ZDQWUHVXOWVSHUSDJHVRUWHGE\SULFHIURPKLJKWRORZ\RXFDQGRWKHIROORZLQJ
> db.stock.find({"desc" : "mp3"}).limit(50).sort({"price" : -1})
,IWKH\FOLFN1H[W3DJHWRVHHPRUHUHVXOWV\RXFDQVLPSO\DGGD VNLSWRWKHTXHU\ZKLFKZLOOVNLSRYHUWKHILUVWPDWFKHVZKLFKWKHXVHUDOUHDG\VDZRQSDJH
> db.stock.find({"desc" : "mp3"}).limit(50).skip(50).sort({"price" : -1})
+RZHYHUODUJHVNLSVDUHQRWYHU\SHUIRUPDQWVRWKHUHDUHVXJJHVWLRQVRQDYRLGLQJWKHPLQDPRPHQW
Comparison order
0RQJR'%KDVDKLHUDUFK\DVWRKRZW\SHVFRPSDUH6RPHWLPHV\RXZLOOKDYHDVLQJOHNH\ZLWKPXOWLSOHW\SHVIRULQVWDQFHLQWHJHUVDQGERROHDQVRUVWULQJVDQGQXOOV,I\RXGRDVRUWRQDNH\ZLWKDPL[RIW\SHVWKHUHLVDSUHGHILQHGRUGHUWKDWWKH\ZLOOEHVRUWHGLQ)URPOHDVWWRJUHDWHVWYDOXHWKLVRUGHULQJLVDVIROORZV
0LQLPXPYDOXH
null
1XPEHUVLQWHJHUVORQJVGRXEOHV
6WULQJV
2EMHFWGRFXPHQW $UUD\
%LQDU\GDWD
2EMHFW,'
%RROHDQ
'DWH
7LPHVWDPS
5HJXODUH[SUHVVLRQ
0D[LPXPYDOXH
Avoiding Large Skips8VLQJskipIRUDVPDOOQXPEHURIGRFXPHQWVLVILQH)RUDODUJHQXPEHURIUHVXOWVskipFDQEHVORZWKLVLVWUXHLQQHDUO\HYHU\GDWDEDVHQRWMXVW0RQJR'%DQGVKRXOGEHDYRLGHG8VXDOO\\RXFDQEXLOGFULWHULDLQWR WKH GRFXPHQWVWKHPVHOYHVWRDYRLG
58 | Chapter 4:Querying
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
42/48
KDYLQJWRGRODUJHVNLSVRU\RXFDQFDOFXODWHWKHQH[WTXHU\EDVHGRQWKHUHVXOWIURPWKHSUHYLRXVRQH
Paginating results without skip
7KHHDVLHVWZD\WRGRSDJLQDWLRQLVWRUHWXUQWKHILUVWSDJHRIUHVXOWVXVLQJOLPLWDQG
WKHQUHWXUQHDFKVXEVHTXHQWSDJHDVDQRIIVHWIURPWKHEHJLQQLQJ> // do not use: slow for large skips> var page1 = db.foo.find(criteria).limit(100)> var page2 = db.foo.find(criteria).skip(100).limit(100)> var page3 = db.foo.find(criteria).skip(200).limit(100)...
+RZHYHUGHSHQGLQJRQ\RXUTXHU\\RXFDQXVXDOO\ILQGDZD\WRSDJLQDWHZLWKRXWskipV)RUH[DPSOHVXSSRVHZHZDQWWRGLVSOD\GRFXPHQWVLQGHVFHQGLQJRUGHUEDVHGRQ"date":HFDQJHWWKHILUVWSDJHRIUHVXOWVZLWKWKHIROORZLQJ
> var page1 = db.foo.find().sort({"date" : -1}).limit(100)
7KHQZHFDQXVHWKH"date"YDOXHRIWKHODVWGRFXPHQWDVWKHFULWHULDIRUIHWFKLQJWKHQH[WSDJH
var latest = null;
// display first pagewhile (page1.hasNext()) {
latest = page1.next();display(latest);
}
// get next pagevar page2 = db.foo.find({"date" : {"$gt" : latest.date}});
page2.sort({"date" : -1}).limit(100);
1RZWKHTXHU\GRHVQRWQHHGWRLQFOXGHDskip
Finding a random document
2QHIDLUO\FRPPRQSUREOHPLVKRZWRJHWDUDQGRPGRFXPHQWIURPDFROOHFWLRQ7KHQDLYHDQGVORZVROXWLRQLVWRFRXQWWKHQXPEHURIGRFXPHQWVDQGWKHQGRD findVNLSSLQJDUDQGRPQXPEHURIGRFXPHQWVEHWZHHQDQGWKHVL]HRIWKHFROOHFWLRQ
> // do not use> var total = db.foo.count()> var random = Math.floor(Math.random()*total)> db.foo.find().skip(random).limit(1)
,WLVDFWXDOO\KLJKO\LQHIILFLHQWWRJHWDUDQGRPHOHPHQWWKLVZD\\RXKDYHWRGRDFRXQWZKLFKFDQEHH[SHQVLYHLI\RXDUHXVLQJFULWHULDDQGVNLSSLQJODUJHQXPEHUVRIHOHPHQWVFDQEHWLPHFRQVXPLQJ
,WWDNHVDOLWWOHIRUHWKRXJKWEXWLI\RXNQRZ\RXOOEHORRNLQJXSDUDQGRPHOHPHQWRQDFROOHFWLRQWKHUHVDPXFKPRUHHIILFLHQWZD\WRGRVR7KHWULFNLVWRDGGDQH[WUD
Cursors | 59
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
43/48
UDQGRPNH\WRHDFKGRFXPHQWZKHQLWLVLQVHUWHG)RULQVWDQFHLIZHUHXVLQJWKHVKHOOZHFRXOGXVHWKHMath.random()IXQFWLRQZKLFKFUHDWHVDUDQGRPQXPEHUEHWZHHQDQG
> db.people.insert({"name" : "joe", "random" : Math.random()})> db.people.insert({"name" : "john", "random" : Math.random()})> db.people.insert({"name" : "jim", "random" : Math.random()})
1RZZKHQZHZDQWWRILQGDUDQGRPGRFXPHQWIURPWKHFROOHFWLRQZHFDQFDOFXODWHDUDQGRPQXPEHUDQGXVHWKDWDVTXHU\FULWHULDLQVWHDGRIGRLQJDskip
> var random = Math.random()> result = db.foo.findOne({"random" : {"$gt" : random}})
7KHUHLVDVOLJKWFKDQFHWKDWrandomZLOOEHJUHDWHUWKDQDQ\RIWKH"random"YDOXHVLQWKHFROOHFWLRQDQGQRUHVXOWVZLOOEHUHWXUQHG:HFDQJXDUGDJDLQVWWKLVE\VLPSO\UHWXUQLQJDGRFXPHQWLQWKHRWKHUGLUHFWLRQ
> if (result == null) {... result = db.foo.findOne({"random" : {"$lt" : random}})
... }
,IWKHUHDUHQWDQ\GRFXPHQWVLQWKHFROOHFWLRQWKLVWHFKQLTXHZLOOHQGXSUHWXUQLQJnullZKLFKPDNHVVHQVH
7KLVWHFKQLTXHFDQEHXVHGZLWKDUELWUDULO\FRPSOH[TXHULHVMXVWPDNHVXUHWRKDYHDQLQGH[WKDWLQFOXGHVWKHUDQGRPNH\)RUH[DPSOHLIZHZDQWWRILQGDUDQGRPSOXPEHULQ&DOLIRUQLDZHFDQFUHDWHDQLQGH[RQ"profession""state"DQG"random"
> db.people.ensureIndex({"profession" : 1, "state" : 1, "random" : 1})
7KLVDOORZVXVWRTXLFNO\ILQGDUDQGRPUHVXOWVHH&KDSWHUIRUPRUHLQIRUPDWLRQRQLQGH[LQJ
Advanced Query Options7KHUHDUHWZRW\SHVRITXHULHV ZUDSSHGDQGSODLQ$SODLQTXHU\LVVRPHWKLQJOLNHWKLV
> var cursor = db.foo.find({"foo" : "bar"})
7KHUHDUHDFRXSOHRSWLRQVWKDWZUDSWKHTXHU\)RUH[DPSOHVXSSRVHZHSHUIRUPDVRUW
> var cursor = db.foo.find({"foo" : "bar"}).sort({"x" : 1})
,QVWHDGRIVHQGLQJ{"foo" : "bar"}WRWKHGDWDEDVHDVWKHTXHU\WKHTXHU\JHWVZUDSSHG
LQDODUJHUGRFXPHQW7KHVKHOOFRQYHUWVWKHTXHU\IURP{"foo" : "bar"}WR{"$query" :{"foo" : "bar"}, "$orderby" : {"x" : 1}}
0RVWGULYHUVSURYLGHKHOSHUVIRUDGGLQJDUELWUDU\RSWLRQVWRTXHULHV2WKHUKHOSIXORSWLRQVLQFOXGHWKHIROORZLQJ
$maxscan : integer6SHFLI\WKHPD[LPXPQXPEHURIGRFXPHQWVWKDWVKRXOGEHVFDQQHGIRUWKHTXHU\
60 | Chapter 4:Querying
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
44/48
$min : document6WDUWFULWHULDIRUTXHU\LQJ
$max : document(QGFULWHULDIRUTXHU\LQJ
$hint : document
7HOOWKHVHUYHUZKLFKLQGH[WRXVHIRUWKHTXHU\$explain : boolean
*HWDQH[SODQDWLRQRIKRZWKHTXHU\ZLOOEHH[HFXWHGLQGH[HVXVHGQXPEHURIUHVXOWVKRZORQJLWWDNHVHWFLQVWHDGRIDFWXDOO\GRLQJWKHTXHU\
$snapshot : boolean(QVXUHWKDWWKHTXHU\VUHVXOWVZLOOEHDFRQVLVWHQWVQDSVKRWIURPWKHSRLQWLQWLPHZKHQWKHTXHU\ZDVH[HFXWHG6HHWKHQH[WVHFWLRQIRUGHWDLOV
Getting Consistent Results$IDLUO\FRPPRQZD\RISURFHVVLQJGDWDLVWRSXOOLWRXWRI0RQJR'%FKDQJHLWLQVRPHZD\DQGWKHQVDYHLWDJDLQ
cursor = db.foo.find();
while (cursor.hasNext()) {var doc = cursor.next();doc = process(doc);db.foo.save(doc);
}
7KLVLVILQHIRUDVPDOOQXPEHURIUHVXOWVEXWLWEUHDNVGRZQIRUODUJHQXPEHUVRIGRFXPHQWV7RVHHZK\LPDJLQHKRZWKHGRFXPHQWVDUHDFWXDOO\EHLQJVWRUHG
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
45/48
1RZRXUSURJUDPFRQWLQXHVWRIHWFKEDWFKHVRIGRFXPHQWV:KHQLWJHWVWRZDUGWKHHQGLWZLOOUHWXUQWKHUHORFDWHGGRFXPHQWVDJDLQ)LJXUH
)LJXUH$FXUVRUPD\UHWXUQWKHVHUHORFDWHGGRFXPHQWVDJDLQLQDODWHUEDWFK
7KHVROXWLRQWRWKLVSUREOHPLVWRVQDSVKRW\RXUTXHU\,I\RXDGGWKH"$snapshot"RSWLRQWKHTXHU\ZLOOEHUXQDJDLQVWDQXQFKDQJLQJYLHZRIWKHFROOHFWLRQ$OOTXHULHVWKDWUHWXUQDVLQJOHEDWFKRIUHVXOWVDUHHIIHFWLYHO\VQDSVKRWWHG,QFRQVLVWHQFLHVDULVH
)LJXUH$QHQODUJHGGRFXPHQWPD\QRWILWZKHUHLWGLGEHIRUH
)LJXUH0RQJR'%UHORFDWHVXSGDWHGGRFXPHQWVWKDWGRQWILWLQWKHLURULJLQDOSRVLWLRQ
62 | Chapter 4:Querying
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
46/48
RQO\ZKHQWKHFROOHFWLRQFKDQJHVXQGHUDFXUVRUZKLOHLWLVZDLWLQJWRJHWDQRWKHUEDWFKRIUHVXOWV
Cursor Internals
7KHUHDUHWZRVLGHVWRDFXUVRUWKHFOLHQWIDFLQJFXUVRUDQGWKHGDWDEDVHFXUVRUWKDWWKHFOLHQWVLGHRQHUHSUHVHQWV:HKDYHEHHQWDONLQJDERXWWKHFOLHQWVLGHRQHXSXQWLOQRZEXWZHDUHJRLQJWRWDNHDEULHIORRNDWZKDWVKDSSHQLQJRQWKHVHUYHUVLGH
2QWKHVHUYHUVLGHDFXUVRUWDNHVXSPHPRU\DQGUHVRXUFHV2QFHDFXUVRUUXQVRXWRIUHVXOWVRUWKHFOLHQWVHQGVDPHVVDJHWHOOLQJLWWRGLHWKHGDWDEDVHFDQIUHHWKHUHVRXUFHVLWZDVXVLQJ)UHHLQJWKHVHUHVRXUFHVOHWVWKHGDWDEDVHXVHWKHPIRURWKHUWKLQJVZKLFKLVJRRGVRZHZDQWWRPDNHVXUHWKDWFXUVRUVFDQEHIUHHGTXLFNO\ZLWKLQUHDVRQ
7KHUHDUHDFRXSOHRIFRQGLWLRQVWKDWFDQFDXVHWKHGHDWKDQGVXEVHTXHQWFOHDQXSRIDFXUVRU)LUVWZKHQDFXUVRUILQLVKHVLWHUDWLQJWKURXJKWKHPDWFKLQJUHVXOWVLWZLOOFOHDQLWVHOIXS$QRWKHUZD\LVWKDWZKHQDFXUVRUJRHVRXWRIVFRSHRQWKHFOLHQWVLGHWKHGULYHUVVHQGWKHGDWDEDVHDVSHFLDOPHVVDJHWROHWLWNQRZWKDWLWFDQNLOOWKDWFXUVRU)LQDOO\HYHQLIWKHXVHUKDVQWLWHUDWHGWKURXJKDOOWKHUHVXOWVDQGWKHFXUVRULVVWLOOLQVFRSHDIWHUPLQXWHVRILQDFWLYLW\DGDWDEDVHFXUVRUZLOODXWRPDWLFDOO\GLH
7KLVGHDWKE\WLPHRXWLVXVXDOO\WKHGHVLUHGEHKDYLRUYHU\IHZDSSOLFDWLRQVH[SHFWWKHLUXVHUVWRVLWDURXQGIRUPLQXWHVDWDWLPHZDLWLQJIRUUHVXOWV+RZHYHUVRPHWLPHV\RXPLJKWNQRZWKDW\RXQHHGDFXUVRUWRODVWIRUDORQJWLPH,QWKDWFDVHPDQ\GULYHUVKDYHLPSOHPHQWHGDIXQFWLRQFDOOHGimmortalRUDVLPLODUPHFKDQLVPZKLFKWHOOVWKHGDWDEDVHQRWWRWLPHRXWWKHFXUVRU,I\RXWXUQRIIDFXUVRUVWLPHRXW\RXPXVWLWHUDWHWKURXJKDOORILWVUHVXOWVRUPDNHVXUHLWJHWVFORVHG2WKHUZLVHLWZLOOVLWDURXQGLQWKH
GDWDEDVHKRJJLQJUHVRXUFHVIRUHYHU
Cursor Internals | 63
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
47/48
-
7/29/2019 MongoDB TDG Chap2 4 Sampler
48/48
You can find this atoreilly.com
in print or ebook format.
Its also available at your favorite book retailer,including iTunes, the Android Market, Amazon,
and Barnes & Noble.
Want to read more?
book
http://oreilly.com/catalog/0636920001096/http://oreilly.com/http://oreilly.com/http://oreilly.com/http://bit.ly/oreillyappshttp://www.android.com/market/http://amazon.com/http://www.barnesandnoble.com/http://oreilly.com/catalog/0636920001096/http://oreilly.com/catalog/0636920001096/http://oreilly.com/http://www.barnesandnoble.com/http://amazon.com/http://www.android.com/market/http://bit.ly/oreillyapps
top related