mongodb tdg chap2 4 sampler

Upload: kunal-taneja

Post on 14-Apr-2018

220 views

Category:

Documents


0 download

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:[email protected]:[email protected]://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" : "[email protected]"

    }

    $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" : "[email protected]","content" : "nice post."

    },{

    "name" : "bob","email" : "[email protected]","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" : "[email protected]",

    "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