<?xml version="1.0" standalone="yes"?>
<root><unlikely-outliner><subject><mongo-db><outline><chapter><getting-started><number0>Getting Started</number0><number1>Getting Started</number1></getting-started><what-is-mongo-db><number0>What is MongoDB?</number0><number1>What is MongoDB?</number1></what-is-mongo-db><install-and-config><number0>Installation and Configuration</number0><number1>Install / Config</number1></install-and-config><c-r-u-d-operations><number0>Create, Read, Update and Delete Operations</number0><number1>C.R.U.D. Ops</number1></c-r-u-d-operations><data-modeling><number0>Data Modeling</number0><number1>Data Modeling</number1></data-modeling><database-management><number0>MongoDB Database Management</number0><number1>Database Mgmt</number1></database-management></chapter><getting-started><number1><chap>What does the course cover?</chap><topic><number1><item/><answer><number0/></answer></number1></topic></number1><number2><chap>How do you set up for the course?</chap><topic><number1><item>Make sure you have LAMP / MAMP / WAMP / XAMPP installed</item><answer><number0/></answer></number1><number2><item>Command line / terminal application</item><answer><number0>Make sure you know how to open up a command prompt for your operating system</number0><number1>For Mac users this is the "Terminal" application</number1><number2>For Windows users, from the Start menu, type &lt;b&gt;cmd&lt;/b&gt;</number2><number3>For Linux users usually CTRL+ALT+T works, otherwise look for a command "Terminal"</number3></answer></number2><number3><item>The installation of MongoDB will be covered in the installation lab</item><answer><number0/></answer></number3><number4><item>Download or copy the Working Files folder into your home folder</item><answer><number0/></answer></number4><number5><item>Demo test programs used in the course</item><answer><number0>Use PHP from the command line</number0><number1>In some cases use the &lt;b&gt;mongo&lt;/b&gt; command shell</number1></answer></number5><number6><item>Sample data</item><answer><number0>The Working Files folder for the installation chapter has sample data which can be imported once you have MongoDB running</number0></answer></number6></topic></number2><number3><chap>About the Author</chap><topic><number1><item>Work</item><answer><number0>&lt;b&gt;unlikelysource.com&lt;/b&gt;</number0><number1>Contract instructor for Zend Technologies</number1><number2>Simple Email Form Joomla extension</number2></answer></number1><number2><item>Programming Languages Used</item><answer><number0>PHP, PERL, Javascript/jQuery</number0><number1>Java, XSLT, C / C++</number1><number2>FORTH, Assembler, BASIC</number2><number3>Prolog, FORTRAN, PL/I</number3></answer></number2><number3><item>OS, Environments and Protocols</item><answer><number0>Novell NetWare</number0><number1>Windows: 3 to 8</number1><number2>Linux/Unix: Red Hat, SuSE, Ubuntu, System V</number2><number3>Active Directory, eDirectory (NDS)</number3><number4>TCP/UDP, IPv4, IPv6, IPX</number4><number5>LDAP, SNMP, SMTP</number5><number6>XML, SOAP, REST</number6></answer></number3><number4><item>Education</item><answer><number0>State University of New York at Potsdam</number0><number1>Golden Gate University, San Francisco: C and AI</number1><number2>UC Santa Cruz Extension, Silicon Valley: SNMP and BASH</number2><number3>Novell Technical Training: TCP/IP, Java J2EE and Struts, </number3><number4>HTML, XSLT, DirXML, Protocol Analysis, Security and Management, </number4><number5>Web Services, Routing, Network Design, and OS Integration</number5><number6>Zend: PHP and Zend Framework</number6></answer></number4><number5><item>Certifications</item><answer><number0>Zend Certified Engineer:</number0><number1>PHP 5.1, 5.3, 5.5, Zend Framework 1, Zend Framework 2</number1><number2>Novell: MCNE, MCNI</number2><number3>CompTIA: Certified Tech Trainer</number3></answer></number5></topic></number3><number4><chap>Outro</chap><topic><number1><item>The MongoDB configuration filename</item><answer><number0>Referred to as "mongod.conf" in the course</number0><number1>Depends on the installation</number1><number2>Could also be "mongodb.conf" or "mongo.conf"</number2></answer></number1><number2><item>Installing the MongoDB PHP programming driver</item><answer><number0>Make sure you have LAMP / MAMP / WAMP / XAMPP installed</number0><number1>Run "phpinfo()" to find out what version of PHP is installed</number1><number2>Find out details on your operating system (i.e. 32 bit, 64 bit, etc.)</number2><number3>Choose the appropriate MongoDB driver accordingly</number3></answer></number2></topic></number4></getting-started><what-is-mongo-db><number1><chap>What is meant by NoSQL?</chap><topic><number1><item>No "official" definition exists</item><answer><number0>No SQL, or Not Only SQL</number0><number1>Non-relational, distributed, open source, scalable</number1></answer></number1><number2><item>Does not use relational model</item><answer><number0>No tables, rows, columns and relations</number0><number1>Different models used:</number1><number2>Column, document, key-value and graph</number2><number3>Other models:</number3><number4>Multimodel (OrientDB), Object (db4o), Grid/Cloud, XML (Berkeley DB XML), Multidimensional (GT.M), Multivalue (TigerLogic PICK)</number4></answer></number2><number3><item>No fixed schema</item><answer><number0>Lowest unit of MongoDB data is a "document"</number0><number1>Uses a JSON document as basis</number1><number2>Allows considerable flexibility</number2><number3>JSON is converted to BSON for storage</number3></answer></number3><number4><item>Driven by "big data"</item><answer><number0>Scales extremely well</number0><number1>Works well in clustered/cloud environment</number1><number2>Google Bigtable</number2><number3>Amazon SimpleDB</number3></answer></number4><number5><item>Examples</item><answer><number0>MongoDB, CouchDB, RavenDB : &lt;b&gt;Document&lt;/b&gt; </number0><number1>Cassandra, Apache HBase (Hadoop) : &lt;b&gt;Column&lt;/b&gt;</number1><number2>Redis, Riak, DynamoDB : &lt;b&gt;Key/Value&lt;/b&gt; </number2><number3>Neo4j, Titan : &lt;b&gt;Graph&lt;/b&gt;</number3></answer></number5></topic></number1><number2><chap>Why use MongoDB?</chap><topic><number1><item>Has all advantages mentioned for NoSQL</item><answer><number0>Non-relational, distributed, open source, scalable</number0><number1>Works well in clustered/cloud environment</number1><number2>Data is modeling matches application objects</number2></answer></number1><number2><item>Well supported</item><answer><number0>&lt;b&gt;Languages supported:&lt;/b&gt;</number0><number1>C, C++, C#</number1><number2>Scala, Haskell, Java, javascript</number2><number3>PHP, PERL, Ruby</number3></answer></number2><number3><item>Fits better with object oriented programming</item><answer><number0>Your data structures can match your application</number0><number1>Data stored as JSON documents</number1><number2>JSON is converted to BSON for storage</number2></answer></number3><number4><item>Extremely fast and scalable</item><answer><number0>No complex relations between tables</number0><number1>Related data stored together</number1><number2>Capacity can be increased through "sharding" without down-time</number2></answer></number4><number5><item>How popular is MongoDB?</item><answer><number0>Depending on the rankings, RDBMS are solidly in the Top 10</number0><number1>According to some, MongoDB is number 6&lt;a target="_blank" href="http://db-engines.com/en/ranking"&gt;.&lt;/a&gt;</number1></answer></number5><number6><item>What are some common use cases for MongoDB</item><answer><number0>Archiving, CMS, eCommerce, Analytics, Social Networking</number0><number1>Session and user profile storage</number1><number2>Heavily used content-driven websites</number2><number3>Delivering content to mobile apps</number3><number4>Data aggregation (i.e. getting P.O.S. info for loyalty points)</number4></answer></number6></topic></number2><number3><chap>What are some common MongoDB terms?</chap><topic><number1><item>Document</item><answer><number0>Basic unit of data</number0><number1>Based on objects represented as JSON</number1><number2>Stored in a binary format BSON</number2><number3>Can have one or more fields</number3><number4>Grouped together as &lt;i&gt;collections&lt;/i&gt;</number4><number5>Examples ...</number5></answer></number1><number2><item>Field</item><answer><number0>Smallest subdivision within a &lt;i&gt;document&lt;/i&gt;</number0><number1>Analogous to a column in a database table</number1><number2>Examples ...</number2></answer></number2><number3><item>Collection</item><answer><number0>Group of &lt;i&gt;documents&lt;/i&gt;</number0><number1>Like an RDBMS &lt;i&gt;table&lt;/i&gt;</number1><number2>Exists within a mongoDB &lt;i&gt;database&lt;/i&gt;</number2><number3>No fixed/rigid schema: documents can have different fields</number3><number4>Collections should represent data with a common purpose</number4><number5>Examples ...</number5></answer></number3><number4><item>Referencing</item><answer><number0>Used for 1-to-many relationships</number0><number1>More efficient storage</number1><number2>Allows for &lt;i&gt;normalized&lt;/i&gt; data structures</number2><number3>Slower and less efficient to read</number3><number4>Examples ...</number4></answer></number4><number5><item>Embedding</item><answer><number0>Lets you to represent 1-to-1 and 1-to-many relationships</number0><number1>Allows for &lt;i&gt;de-normalized&lt;/i&gt; complex modeling</number1><number2>Brings in data where it is needed</number2><number3>"Document Growth" can affect writes and risk fragmentation</number3><number4>Examples ...</number4></answer></number5><number6><item>Cursor</item><answer><number0>Used to iterate through results of a query</number0><number1>Produced by &lt;i&gt;find()&lt;/i&gt;</number1><number2>Further ops are possible: sort(),limit(),etc.</number2></answer></number6></topic></number3><number4><chap>What are the more important MongoDB features?</chap><topic><number1><item>Indexes</item><answer><number0>Improves performance for frequent queries</number0><number1>Indexes are based on a field or set of fields</number1><number2>Queries containing only indexed fields are optimal</number2><number3>Can affect other operations such as sort()</number3><number4>Main Types: &lt;i&gt;single field&lt;/i&gt; and &lt;i&gt;compound&lt;/i&gt;</number4><number5>Other types: multikey, geospatial, text, hashed</number5><number6>Properties: unique, sparse</number6></answer></number1><number2><item>Distributed queries</item><answer><number0>Sharded clusters allow you to partition a data set</number0><number1>Reads are most efficient when directed to a specific shard</number1><number2>Scatter gather queries (no shard key) can be inefficient</number2></answer></number2><number3><item>Read preferences</item><answer><number0>Allows you to control queries (reads)</number0><number1>Concerns &lt;i&gt;replica sets&lt;/i&gt;</number1><number2>&lt;b&gt;Modes:&lt;/b&gt; primary, primaryPreferred, secondary, &lt;br /&gt;secondaryPreferred, nearest</number2></answer></number3><number4><item>Distributed write operations</item><answer><number0>Directs write operations from apps to shard clusters</number0><number1>Partitions data into ranges based on value of the shard key</number1><number2>Write operations go to the primary</number2><number3>Secondaries continuously replicating the primary oplog &lt;br /&gt;and apply the operations to themselves</number3><number4>Write concerns can apply</number4></answer></number4><number5><item>Write concerns</item><answer><number0>Guaranteed delivery</number0><number1>Stronger settings: slower, better guarantee</number1><number2>&lt;b&gt;Levels:&lt;/b&gt; Errors Ignored, Unacknowledged, Acknowledged, &lt;br /&gt;Journaled, Replica Acknowledged</number2></answer></number5><number6><item>Query plans and optimizers</item><answer><number0>Optimizer processes queries</number0><number1>Chooses the most efficient query plan</number1><number2>Over time deletes and re-evaluates the plan</number2></answer></number6></topic></number4><number5><chap>What is MongoDB Aggregation?</chap><topic><number1><item>Modalities: Pipeline, Map-Reduce, Single Purpose</item><answer><number0>Pipeline</number0><number1>Map Reduce</number1><number2>Single Purpose</number2></answer></number1><number2><item>Pipeline Aggregation</item><answer><number0>Groups values from multiple documents</number0><number1>Performs ops on grouped data</number1><number2>Returns single result</number2><number3>Like SQL GROUP BY and HAVING</number3></answer></number2><number3><item>Map-Reduce Aggregation</item><answer><number0>Condenses large volumes of data into useful aggregated results</number0><number1>Operation: Map, Reduce, Finalize</number1><number2>&lt;b&gt;Map:&lt;/b&gt; function emits key-value pairs</number2><number3>&lt;b&gt;Reduce:&lt;/b&gt; collects and condenses the aggregated data</number3><number4>&lt;b&gt;Finalize:&lt;/b&gt; further condenses or processes the results</number4></answer></number3><number4><item>Single Purpose Aggregation</item><answer><number0>Operations: &lt;i&gt;count&lt;/i&gt;, &lt;i&gt;distinct&lt;/i&gt; and &lt;i&gt;group&lt;/i&gt;</number0><number1>Easy to use</number1><number2>Limited in scope</number2></answer></number4></topic></number5><number6><chap>LAB: Official Try MongoDB Tutorial</chap><topic><number1><item>Take the MongoDB Tutorial</item><answer><number0>http://try.mongodb.org/</number0></answer></number1><number2><item>Save a document</item><answer><number0>db.test.save({a:1})</number0></answer></number2><number3><item>Find documents</item><answer><number0>db.test.find()</number0></answer></number3></topic></number6></what-is-mongo-db><install-and-config><number1><chap>General considerations</chap><topic><number1><item>How do you test the installation?</item><answer><number0>Open another command prompt</number0><number1>Run the command to start MongoDB</number1><number2>Use the default database: &lt;b&gt;use mydb&lt;/b&gt;</number2><number3>Save a test document: &lt;b&gt;db.test.save({a:1})&lt;/b&gt;</number3><number4>Find the test document: &lt;b&gt;db.test.find()&lt;/b&gt;</number4></answer></number1><number2><item>What if MongoDB does not start?</item><answer><number0>Make sure you have added "dbpath" and "logpath" parameters to the MongoDB config file</number0><number1>Make sure the "dbpath" and "logpath" directories have been created</number1><number2>Make sure that MongoDB has permissions to read from &lt;br /&gt;and write to the log and database path directories</number2><number3>Did you install the right version?</number3></answer></number2><number3><item>What about security?</item><answer><number0>Authentication is disabled by default</number0><number1>Review the security videos to learn how to enable authentication</number1></answer></number3></topic></number1><number2><chap>Installing MongoDB on Windows -- Part 1</chap><topic><number1><item>Download correct version</item><answer><number0>Run &lt;i&gt;wmic os get osarchitecture&lt;/i&gt; from command prompt</number0><number1>MongoDB for Windows Server 2008 R2</number1><number2>MongoDB for Windows 64-bit</number2><number3>MongoDB for Windows 32-bit</number3><number4>Windows XP and versions below are not supported</number4><number5>Windows Server 2008 R2 or Windows 7 need hotfix 2731284</number5></answer></number1><number2><item>Extract to C:\</item><answer><number0>You can then rename the folder created</number0><number1>MongoDB is self-contained</number1></answer></number2><number3><item>Create &lt;i&gt;data&lt;/i&gt; and &lt;i&gt;log&lt;/i&gt; folders</item><answer><number0>Data folder: &lt;b&gt;md c:\data\db&lt;/b&gt;</number0><number1>Log folder: &lt;b&gt;md c:\path\to\mongodb\log&lt;/b&gt;</number1></answer></number3><number4><item>Create config file &lt;i&gt;mongo.cfg&lt;/i&gt;</item><answer><number0>Enter log file path into new config file: &lt;br /&gt;&lt;b&gt;echo logpath=c:\path\to\mongodb\log\mongo.log &gt; c:\path\to\mongodb\mongod.cfg&lt;/b&gt;</number0></answer></number4><number5><item>Starting: from a command prompt</item><answer><number0>Open a command prompt</number0><number1>Type: &lt;b&gt;c:\path\to\mongodb\bin\mongod.exe&lt;/b&gt;</number1><number2>If using another data folder: &lt;br /&gt;c:\path\to\mongodb\bin\mongod.exe --dbpath "drive:\path\to\data"</number2></answer></number5><number6><item>Connect to MongoDB</item><answer><number0>Open another command prompt</number0><number1>Type: &lt;b&gt;c:\path\to\mongodb\bin\mongod.exe&lt;/b&gt;</number1><number2>Use the default database: &lt;b&gt;use mydb&lt;/b&gt;</number2><number3>Save a test document: &lt;b&gt;db.test.save({a:1})&lt;/b&gt;</number3><number4>Find the test document: &lt;b&gt;db.test.find()&lt;/b&gt;</number4></answer></number6></topic></number2><number3><chap>Installing MongoDB on Windows -- Part 2</chap><topic><number1><item>Starting: as a Windows service</item><answer><number0>Open a command prompt</number0><number1>Install the MongoDB service: &lt;br /&gt;&lt;b&gt;c:\path\to\mongodb\bin\mongod.exe --config c:\path\to\mongodb\mongod.cfg --install&lt;/b&gt;</number1><number2>Start the service: &lt;b&gt;net start MongoDB&lt;/b&gt;</number2></answer></number1><number2><item>Stopping / Removing Windows service</item><answer><number0>Open a command prompt</number0><number1>Stop the service: &lt;b&gt;net stop MongoDB&lt;/b&gt;</number1><number2>Remove the MongoDB service: &lt;br /&gt;&lt;b&gt;c:\path\to\mongodb\bin\mongod.exe --remove&lt;/b&gt;</number2></answer></number2><number3><item>Connect to MongoDB</item><answer><number0>Open another command prompt</number0><number1>Type: &lt;b&gt;c:\path\to\mongodb\bin\mongod.exe&lt;/b&gt;</number1><number2>Use the default database: &lt;b&gt;use mydb&lt;/b&gt;</number2><number3>Save a test document: &lt;b&gt;db.test.save({a:1})&lt;/b&gt;</number3><number4>Find the test document: &lt;b&gt;db.test.find()&lt;/b&gt;</number4></answer></number3></topic></number3><number4><chap>Installing MongoDB on a Mac</chap><topic><number1><item>Download from &lt;b&gt;mongodb.org/downloads&lt;/b&gt;</item><answer><number0/></answer></number1><number2><item>Extract to a folder</item><answer><number0>Open the terminal app</number0><number1>tar xvfz Downloads/mongodb-osx-x86_62-nn-nn-nn.nn.nn.tgz</number1></answer></number2><number3><item>Rename the folder &lt;b&gt;mv &lt;/b&gt;</item><answer><number0>mv mongodb-osx-x86_62-nn-nn-nn.nn.nn mongodb</number0></answer></number3><number4><item>Create a data folder</item><answer><number0>mkdir data</number0><number1>mkdir data/db</number1></answer></number4><number5><item>Put the binaries in the path</item><answer><number0>echo "export PATH=$PATH:/path/to/mongodb"&gt;.bash_profile</number0><number1>Exit the terminal app</number1><number2>Reopen the terminal app</number2></answer></number5><number6><item>Create a /path/to/mongodb/mongod.conf file</item><answer><number0>Copy the sample from github.com/mongodb/mongo/blob/master/rpm/mongod.conf</number0><number1>Open TextEdit</number1><number2>Format - Make Plain Text</number2><number3>Change "logpath=" and "dbpath="</number3><number4>Save to /path/to/mongodb/mongod.conf</number4></answer></number6><number7><item>Start mongod</item><answer><number0>mongod -f /path/to/mongodb/mongod.conf</number0></answer></number7><number8><item>Test</item><answer><number0>mongo</number0><number1>use mydb</number1><number2>db.test.save({a:1})</number2><number3>db.test.find()</number3></answer></number8></topic></number4><number5><chap>Installing MongoDB on Debian / Ubuntu Linux</chap><topic><number1><item>Find the version of Linux</item><answer><number0>Run &lt;b&gt;uname -a&lt;/b&gt; from a terminal window</number0></answer></number1><number2><item>Download from browser and install</item><answer><number0>Go to Downloads: &lt;b&gt;www.mongodb.org/downloads&lt;/b&gt;</number0><number1>Double click on the completed download filename</number1><number2>Extract to an appropriate folder</number2><number3>Create &lt;b&gt;mongodb&lt;/b&gt; user</number3><number4>Create &lt;b&gt;/data/db&lt;/b&gt;</number4><number5>Assign ownership to &lt;b&gt;mongodb&lt;/b&gt; user</number5></answer></number2><number3><item>Install from the command line: Ubuntu Linux</item><answer><number0>Import MongoDB public key: &lt;br /&gt;&lt;b&gt;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10&lt;/b&gt;</number0><number1>Configure software sources list: &lt;br /&gt;&lt;b&gt;echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" &lt;br /&gt;| sudo tee /etc/apt/sources.list.d/mongodb.list&lt;/b&gt;</number1><number2>Install: &lt;br /&gt;&lt;b&gt;sudo apt-get install mongodb-10gen&lt;/b&gt;</number2></answer></number3><number4><item>Install from the command line: Debian Linux</item><answer><number0>Import MongoDB public key: &lt;br /&gt;&lt;b&gt;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10&lt;/b&gt;</number0><number1>Configure software sources list: &lt;br /&gt;&lt;b&gt;echo "deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen" &lt;br /&gt;| sudo tee /etc/apt/sources.list.d/mongodb.list&lt;/b&gt;</number1><number2>Install: &lt;br /&gt;&lt;b&gt;sudo apt-get install mongodb-10gen&lt;/b&gt;</number2></answer></number4><number5><item>Start / Stop MongoDB</item><answer><number0>Open another command prompt</number0><number1>Start: &lt;b&gt;sudo service mongod start&lt;/b&gt;</number1><number2>Stop: &lt;b&gt;sudo service mongod stop&lt;/b&gt;</number2><number3>Restart:  &lt;b&gt;sudo service mongod restart&lt;/b&gt;</number3><number4>Start after reboot: </number4></answer></number5><number6><item>Connect to MongoDB</item><answer><number0>Open another command prompt</number0><number1>Start the MongoDB service</number1><number2>Connect to the MongoDB shell: &lt;b&gt;mongo&lt;/b&gt;</number2><number3>Use the default database: &lt;b&gt;use mydb&lt;/b&gt;</number3><number4>Save a test document: &lt;b&gt;db.test.save({a:1})&lt;/b&gt;</number4><number5>Find the test document: &lt;b&gt;db.test.find()&lt;/b&gt;</number5></answer></number6></topic></number5><number6><chap>Installing MongoDB on RedHat / CentOS / Fedora Linux</chap><topic><number1><item>Find the version of Linux</item><answer><number0>Run &lt;b&gt;uname -a&lt;/b&gt; from a terminal window</number0></answer></number1><number2><item>Download from browser and install</item><answer><number0>Go to Downloads: &lt;b&gt;www.mongodb.org/downloads&lt;/b&gt;</number0><number1>Double click on the completed download filename</number1><number2>Extract to an appropriate folder</number2><number3>Create &lt;b&gt;mongodb&lt;/b&gt; user</number3><number4>Create &lt;b&gt;/data/db&lt;/b&gt;</number4><number5>Assign ownership to &lt;b&gt;mongodb&lt;/b&gt; user</number5></answer></number2><number3><item>Install from the command line</item><answer><number0>Documented installation does not work!</number0><number1>yum erase mongodb</number1><number2>yum erase mongo-10gen</number2><number3>yum --disablerepo=* --enablerepo=fedora,updates install mongodb mongodb-server</number3></answer></number3><number4><item>Start / Stop MongoDB</item><answer><number0>Open another command prompt</number0><number1>Start: &lt;b&gt;systemctl start mongod.service&lt;/b&gt;</number1><number2>Stop: &lt;b&gt;systemctl stop mongod.service&lt;/b&gt;</number2><number3>Restart:  &lt;b&gt;systemctl restart mongod.service&lt;/b&gt;</number3><number4>Start after reboot: &lt;b&gt;systemctl enable mongod.service&lt;/b&gt;</number4></answer></number4><number5><item>Connect to MongoDB</item><answer><number0>Open another command prompt</number0><number1>Start the MongoDB service</number1><number2>Connect to the MongoDB shell: &lt;b&gt;mongo&lt;/b&gt;</number2><number3>Use the default database: &lt;b&gt;use mydb&lt;/b&gt;</number3><number4>Save a test document: &lt;b&gt;db.test.save({a:2})&lt;/b&gt;</number4><number5>Find the test document: &lt;b&gt;db.test.find()&lt;/b&gt;</number5></answer></number5></topic></number6><number7><chap>Programming language drivers: C, C++, C#</chap><topic><number1><item>Why are drivers important?</item><answer><number0>Using the &lt;b&gt;mongo&lt;/b&gt; command shell is of limited usefulness</number0><number1>Opens up MongoDB to real world applications</number1></answer></number1><number2><item>What drivers are available?</item><answer><number0>JavaScript, Python, Ruby, &lt;br /&gt;PHP, Perl, Java, Scala, &lt;br /&gt;C#, C, C++, &lt;br /&gt;Haskell, Erlang</number0></answer></number2><number3><item>How do you install a driver?</item><answer><number0>Check for pre-compiled binary or installer package</number0><number1>Specific instructions next</number1></answer></number3><number4><item>C, C++ and C#</item><answer><number0>Get &lt;b&gt;c&lt;/b&gt; driver source from &lt;b&gt;github.com/mongodb/mongo-c-driver&lt;/b&gt;</number0><number1>MongoDB is written in C++</number1><number2>For C# get &lt;b&gt;msi&lt;/b&gt; and &lt;b&gt;zip&lt;/b&gt; files from &lt;b&gt;github.com/mongodb/mongo-csharp-driver/releases&lt;/b&gt;</number2></answer></number4></topic></number7><number8><chap>Drivers: Javascript, Python and Ruby</chap><topic><number1><item>Javascript, Python and Ruby</item><answer><number0>Javascript runs server-side using Node.js or as the shell</number0><number1>Python driver best installed using &lt;b&gt;pip&lt;/b&gt; or &lt;b&gt;easy_install&lt;/b&gt;</number1><number2>Ruby driver supported as a "gem"</number2></answer></number1></topic></number8><number9><chap>Drivers: Java, PHP, perl, others</chap><topic><number1><item>Java</item><answer><number0>Java driver jar file: central.maven.org/maven2/org/mongodb/mongo-java-driver/</number0><number1>Java driver source: github.com/mongodb/mongo-java-driver/</number1></answer></number1><number2><item>PHP</item><answer><number0>MongoDB PHP driver should be installed using &lt;b&gt;pecl&lt;/b&gt;</number0><number1>Make sure you have installed &lt;b&gt;pear&lt;/b&gt; which also installs &lt;b&gt;pecl&lt;/b&gt;</number1></answer></number2><number3><item>perl</item><answer><number0>For Windows and Mac: use &lt;b&gt;cpan&lt;/b&gt;</number0><number1>For Linux: find the appropriate MongoDB perl driver package</number1></answer></number3><number4><item>Other Programming Languages</item><answer><number0>Erlang</number0><number1>Scala</number1><number2>Community Supported</number2></answer></number4></topic></number9><number10><chap>Management tools</chap><topic><number1><item>Are there any management tools available?</item><answer><number0>Fang of Mongo, UMongo, MongoExplorer, MongoHub</number0><number1>MongoVision, MongoVUE, Opricot, phpMoAdmin</number1><number2>RockMongo, Genghis, mongobird, Robomongo</number2></answer></number1></topic></number10><number11><chap>MongoDB configuration, import and export</chap><topic><number1><item>How do I configure MongoDB?</item><answer><number0>Edit the &lt;i&gt;mongodb.conf&lt;/i&gt; file</number0><number1>More info: docs.mongodb.org/manual/reference/configuration-options/</number1></answer></number1><number2><item>How do you export data?</item><answer><number0>&lt;b&gt;mongoexport --host &lt;name&gt;&lt;:port&gt; --db DDD --collection CCC --out &lt;FILE&gt;&lt;br /&gt;[--query &lt;JSON&gt; --username &lt;username&gt; --password &lt;password&gt;]&lt;/b&gt;</number0><number1>docs.mongodb.org/manual/reference/program/mongoexport/</number1><number2/><number3/></answer></number2><number3><item>How do you import data?</item><answer><number0>&lt;b&gt;mongoimport --host &lt;name&gt;&lt;:port&gt; --db DDD --collection CCC --file &lt;FILE&gt; &lt;br /&gt;[--type &lt;json|csv|tsv&gt;]&lt;/b&gt;</number0><number1>docs.mongodb.org/manual/reference/program/mongoimport/</number1><number2/><number3/></answer></number3></topic></number11><number12><chap>Using the &lt;i&gt;mongo&lt;/i&gt; built-in javascript shell: access, insert,find</chap><topic><number1><item>What is the mongo javascript shell?</item><answer><number0>Javascript based interactive interface</number0><number1>Lets you interact with MongoDB directly</number1></answer></number1><number2><item>Why is the mongo javascript shell important?</item><answer><number0>You are dealing with the data directly</number0><number1>You can see EXACTLY what is in the database</number1></answer></number2><number4><item>How do you access a database?</item><answer><number0>show databases</number0><number1>&lt;b&gt;db&lt;/b&gt; shows the current database</number1><number2>&lt;b&gt;use&lt;/b&gt; selects a database</number2></answer></number4><number5><item>How do you create a new collection?</item><answer><number0>show collections</number0><number1>db.&lt;i&gt;collection&lt;/i&gt;.save({document})</number1></answer></number5><number6><item>How do you find documents in a collection?</item><answer><number0>db.collection.find()</number0><number1>db.collection.find( { field : "value" } )</number1></answer></number6></topic></number12><number13><chap>Using the &lt;i&gt;mongo&lt;/i&gt; built-in javascript shell: update, remove, functions</chap><topic><number1><item>How do you update documents in a collection?</item><answer><number0>db.collection.update( { &lt;query&gt; }, {$set: { field: "value" }} )</number0></answer></number1><number2><item>How do you remove documents from a collection?</item><answer><number0>db.collection.remove( { &lt;query&gt; } )</number0></answer></number2><number3><item>How do you use javascript functions in the shell?</item><answer><number0>db.system.js.save()</number0><number1>db.eval("function-name")</number1></answer></number3></topic></number13><number14><chap>LAB Instructions: Install MongoDB and the PHP driver</chap><topic><number1><item>Why PHP?</item><answer><number0>Easily understood language</number0><number1>Used on over 244 M websites as of 1-1-2013 (Netcraft)</number1><number2>Largest number of developers</number2></answer></number1><number2><item>Make sure you have LAMP / MAMP / XAMPP installed</item><answer><number0>Not covered in this course</number0></answer></number2><number3><item>Install MongoDB</item><answer><number0>mongodb.org/downloads</number0></answer></number3><number4><item>Test using &lt;b&gt;mongo&lt;/b&gt; shell</item><answer><number0>Open a command prompt</number0><number1>Make sure MongoDB is running</number1><number2>c:\mongodb\bin\mongod -f c:\mongodb\mongod.cfg</number2><number3>Open a MongoDB shell:</number3><number4>c:\mongodb\bin\mongo</number4></answer></number4><number5><item>Install the PHP programming language driver</item><answer><number0/></answer></number5><number6><item>Run the &lt;b&gt;test.php&lt;/b&gt; script</item><answer><number0/></answer></number6></topic></number14><number15><chap>LAB Solution: Install MongoDB and the PHP driver</chap><topic><number1><item>Solution</item><answer><number0/></answer></number1></topic></number15></install-and-config><c-r-u-d-operations><number1><chap>Performing Queries: Overview</chap><topic><number1><item>How do you establish query criteria?</item><answer><number0>Criteria consists of one or more fields</number0><number1>Use the minimum number of fields to identify the document</number1><number2>Demo: customers collection</number2></answer></number1><number2><item>What &lt;i&gt;query operators&lt;/i&gt; are available?</item><answer><number0>Query operators modify the query</number0><number1>Comparison: $gt, $gte, $in, $lt, $lte, $ne, $nin</number1><number2>Logical: $and, $or, $not, $nor</number2><number3>Element: $exists, $type</number3><number4>Evaluation: $mod, $regex, $where</number4><number5>Geospatial: $geoWithin, $geoIntersects, $near, $nearSphere</number5><number6>Array: $all, $elemMatch, $size</number6></answer></number2><number3><item>What are projections?</item><answer><number0>find( { query }, { projection } )</number0><number1>Allows you to specify which fields are returned</number1><number2>In the projection document, 1 = include, 0 = exclude</number2><number3>find( {query},{name:1,_id:0})</number3></answer></number3><number4><item>What &lt;i&gt;projection operators&lt;/i&gt; are available?</item><answer><number0>$, $elemMatch, $slice</number0></answer></number4><number5><item>What about &lt;i&gt;modifiers&lt;/i&gt;?</item><answer><number0>Included in the query:</number0><number1>$comment, $explain, $hint, $maxScan, $max, $min</number1><number2>$orderBy, $returnKey, $showDiskLoc, $snapshot, $query, $natural</number2><number3>Outside the query:</number3><number4>explain(), hint(), limit(), max(), min(), sort(), snapshot()</number4></answer></number5><number6><item>How can you optimize queries?</item><answer><number0>Create an index to cover fields used in query</number0><number1>db.collection.ensureIndex({field:1})</number1><number2>1 = ascending, -1 = descending</number2><number3>Use projections and limit() to limit fields and documents returned</number3><number4>Use explain() to analyze performance</number4><number5>Use hint() to force MongoDB to use a particular index</number5></answer></number6></topic></number1><number2><chap>Performing Queries: Using the Cursor</chap><topic><number1><item>What is a &lt;i&gt;cursor&lt;/i&gt;?</item><answer><number0>Pointer to the result set of a query</number0><number1>You need to &lt;i&gt;iterate&lt;/i&gt; through a cursor to retrieve results</number1><number2>Cursors timeout after 10 minutes of inactivity</number2></answer></number1><number2><item>How do you produce a &lt;i&gt;cursor&lt;/i&gt;?</item><answer><number0>Cursor produced from &lt;i&gt;find()&lt;/i&gt;</number0><number1>Performance is enhanced if find() uses an index</number1></answer></number2><number3><item>How do you use the &lt;i&gt;cursor&lt;/i&gt;?</item><answer><number0>MongoDB command shell iterates automatically</number0><number1>When using a driver, use a loop</number1></answer></number3></topic></number2><number3><chap>Performing Queries: Query Modifications -- Part 1</chap><topic><number1><item>How can you limit the fields returned?</item><answer><number0>Use projections</number0><number1>find({query},{field1:1,field2:0})</number1><number2>1 = include, 0 = exclude</number2></answer></number1><number2><item>How do you limit the number of documents returned?</item><answer><number0>db.collection.find().limit()</number0></answer></number2><number3><item>How do you find one document?</item><answer><number0>db.collection.findOne()</number0><number1>db.collection.find().limit(1)</number1></answer></number3><number4><item>How do you find a document where the value is in an array?</item><answer><number0>db.world_gdp.find({"field.element":{value}})</number0></answer></number4></topic></number3><number4><chap>Performing queries: Query Modifications -- Part 2</chap><topic><number1><item>How do you sort documents?</item><answer><number0>db.collection.find().sort()</number0></answer></number1><number2><item>How do you group documents?</item><answer><number0>db.collection.distinct()</number0><number1>db.collection.aggregate()</number1></answer></number2></topic></number4><number5><chap>Adding Information: Database, Collection and Document</chap><topic><number1><item>How do you create a new database?</item><answer><number0>Type &lt;b&gt;use &lt;i&gt;name&lt;/i&gt;&lt;/b&gt; where &lt;i&gt;name&lt;/i&gt; is the new database</number0><number1>Add a document to a collection</number1></answer></number1><number2><item>How do you create a new collection?</item><answer><number0>Select a database: &lt;i&gt;use name&lt;/i&gt;</number0><number1>Save a document: &lt;i&gt;&lt;b&gt;db.name-of-collection.save({document})&lt;/b&gt;&lt;/i&gt;</number1><number2>A collection &lt;i&gt;name-of-collection&lt;/i&gt; will be created</number2><number3>Alternatively use &lt;i&gt;insert()&lt;/i&gt; instead of &lt;i&gt;save()&lt;/i&gt;</number3></answer></number2><number3><item>How do you insert a single document?</item><answer><number0>&lt;i&gt;db.name-of-collection.save({document})&lt;/i&gt;</number0><number1>&lt;i&gt;db.name-of-collection.insert({document})&lt;/i&gt;</number1></answer></number3><number4><item>How can you insert a group of documents in a batch?</item><answer><number0>&lt;i&gt;db.name-of-collection.insert(array of [{document},{document}])&lt;/i&gt;</number0><number1>May want to specify the &lt;i&gt;write concern&lt;/i&gt;</number1></answer></number4><number5><item>Can you have different fields?</item><answer><number0>Yes</number0></answer></number5><number6><item>What problems can occur when adding information?</item><answer><number0>Beware of typos! You could accidentally create a new database or collection.</number0></answer></number6></topic></number5><number6><chap>Adding Information: Arrays</chap><topic><number1><item>What if your document contains arrays?</item><answer><number0>No problem: use your programming language array syntax</number0></answer></number1><number2><item>Are numeric and associative arrays handled differently?</item><answer><number0>Numeric:</number0><number1>Reference elements by number</number1><number2>In the MongoDB shell: field:[ value, value ]</number2><number3>Associative:</number3><number4>Reference elements by label</number4><number5>In the MongoDB shell: field:[{label1:value1,label2:value2},{etc.}]</number5></answer></number2><number3><item>How do you find info in array fields?</item><answer><number0>Use &lt;i&gt;find()&lt;/i&gt;</number0><number1>Numeric arrays: use &lt;i&gt;$in&lt;/i&gt;</number1><number2>Associative arrays: use &lt;i&gt;array.key&lt;/i&gt; syntax</number2></answer></number3></topic></number6><number7><chap>Adding Information: Objects</chap><topic><number1><item>What if your document contains objects?</item><answer><number0>Programming language objects should not have private or protected properties</number0></answer></number1><number2><item>What about objects inside objects?</item><answer><number0>Make sure the internal objects are represented as public properties</number0></answer></number2><number3><item>How do you find info in object fields?</item><answer><number0>Use &lt;i&gt;find()&lt;/i&gt; and the &lt;i&gt;object-field.property&lt;/i&gt; syntax</number0></answer></number3></topic></number7><number8><chap>Adding Information: the _id field</chap><topic><number1><item>Should you include or exclude the &lt;b&gt;_id&lt;/b&gt; field?</item><answer><number0>&lt;i&gt;_id&lt;/i&gt; is like an RDBMS "auto-increment" field</number0><number1>If &lt;i&gt;_id&lt;/i&gt; is not specified, MongoDB creates this for you</number1><number2>If you specify &lt;i&gt;_id&lt;/i&gt; it &lt;b&gt;must&lt;/b&gt; be unique within the collection!</number2><number3>ObjectID is generated by the client</number3><number4>4 byte Timestamp . 3 byte machine ID . 2 byte PID . 3 byte counter</number4><number5>More info: docs.mongodb.org/manual/reference/object-id/</number5></answer></number1><number2><item>What are the advantages of overwriting the &lt;b&gt;_id&lt;/b&gt; field?</item><answer><number0>Easier to locate documents</number0></answer></number2><number3><item>What are the disadvantages of overwriting the &lt;b&gt;_id&lt;/b&gt; field?</item><answer><number0>Duplicate key error can occur when inserting a document while overwriting the &lt;i&gt;_id&lt;/i&gt; field</number0><number1>Fatal error: Uncaught exception MongoCursorException with message localhost:27017: E11000 duplicate key error index: mydb.collection.$_id_  dup key: { : ObjectId(528908a9ef5c881f68000000) }</number1></answer></number3><number4><item>How can you uniquely ID a document without overwriting &lt;b&gt;_id&lt;/b&gt;?</item><answer><number0>Add an additional field with a your own unique identifying system</number0></answer></number4></topic></number8><number9><chap>Performing Modifications: Basic Document Updates</chap><topic><number1><item>How do you update a single document?</item><answer><number0>Using &lt;i&gt;update({query},{update})&lt;/i&gt;</number0></answer></number1><number2><item>Can you update multiple documents?</item><answer><number0>Yes: using &lt;i&gt;update({query},{update},{upsert},{multi =&gt; TRUE}&lt;/i&gt;</number0><number1>If &lt;i&gt;multi&lt;/i&gt; is TRUE, all documents matching &lt;i&gt;query&lt;/i&gt; are updated</number1><number2>Default value of &lt;i&gt;multi&lt;/i&gt; = FALSE</number2></answer></number2><number3><item>What basic update operators are available?</item><answer><number0>Basic: $inc, $set, $unset, $rename, $setOnInsert</number0><number1>More info: docs.mongodb.org/manual/reference/operator/update/#id1</number1></answer></number3><number4><item>Can you save and update?</item><answer><number0>Using &lt;i&gt;save()&lt;/i&gt; or &lt;i&gt;update({query},{update},TRUE)&lt;/i&gt;</number0><number1>If &lt;i&gt;_id&lt;/i&gt; is unique a new document is saved</number1><number2>If &lt;i&gt;_id&lt;/i&gt; matches the existing document is updated</number2><number3>A new document is added if the &lt;i&gt;upsert&lt;/i&gt; parameter of &lt;i&gt;update()&lt;/i&gt; is TRUE</number3></answer></number4></topic></number9><number10><chap>Performing Modifications: Updating Arrays and Fields</chap><topic><number1><item>How do you update a value in an array field?</item><answer><number0>&lt;i&gt;update({query:array_element},{$set|$inc:{field.$.array_element:value}})&lt;/i&gt;</number0></answer></number1><number2><item>What other update operators are available?</item><answer><number0>Array Operators: $, $addToSet, $pop, $pull, $pullAll, $push, $pushAll</number0><number1>Array Modifiers: $each, $slice, $sort</number1><number2>Others: $bit, $isolated</number2></answer></number2><number3><item>How do you add or remove a field?</item><answer><number0>&lt;i&gt;update()&lt;/i&gt; using &lt;i&gt;$set&lt;/i&gt; or &lt;i&gt;$unset&lt;/i&gt;</number0></answer></number3></topic></number10><number11><chap>Performing Modifications: Deleting Documents</chap><topic><number1><item>How do you delete a single document?</item><answer><number0>db.collection.remove({query}, justOne = TRUE)</number0></answer></number1><number2><item>Can you delete a group of documents at one time?</item><answer><number0>db.collection.remove({query}, justOne = FALSE)</number0><number1>&lt;i&gt;justOne&lt;/i&gt; defaults to FALSE</number1></answer></number2><number3><item>Can you remove a single field?</item><answer><number0>db.collection.update({query},{$unset:{field:1}})</number0></answer></number3><number4><item>How do you delete a collection?</item><answer><number0>To remove all documents: db.collection.remove()</number0><number1>To remove the collection completely: db.collection.drop()</number1></answer></number4><number5><item>How do you remove a database?</item><answer><number0>Use the database</number0><number1>db.dropDatabase()</number1></answer></number5><number6><item>What problems can you run into when removing documents?</item><answer><number0>Be careful to not delete the wrong document!</number0><number1>Be aware that if the {query} provided to &lt;i&gt;remove()&lt;/i&gt; is null ... &lt;br /&gt;you could accidentally erase all documents in the collection!</number1></answer></number6></topic></number11><number12><chap>LAB Instructions: C.R.U.D. Operations on &lt;br /&gt;Sweetscomplete Website</chap><topic><number1><item>Deploy the "sweetscomplete" website</item><answer><number0>Create a folder "sweetscomplete" off the document root for your webserver</number0><number1>Locate the "sweetscomplete" website files in the Working Files folder for the course</number1><number2>Copy these files and folders into the new website folder</number2><number3>Assign ownership to your webserver user (i.e. www-data) to:</number3><number4>sweetscomplete/captcha</number4><number5>sweetscomplete/Model/*.csv and *.bak</number5></answer></number1><number2><item>Test and make sure the website is running</item><answer><number0>From your browser: http://localhost/sweetscomplete/</number0><number1>Select "Products" and verify you can scan through the list of products</number1></answer></number2><number3><item>Import sweetscomplete "Products" data into MongoDB</item><answer><number0>mongoimport -d sweetscomplete -c products --headerline --type csv &lt;br /&gt;--file /path/to/document/root/Model/sweetscomplete_products.csv</number0></answer></number3><number4><item>Rewrite "Model/Products.php" to use MongoDB instead of a CSV file</item><answer><number0>Look for comments starting with "// ***" for clues</number0><number1>Check the Working Files folder "sweetscomplete.complete/Model/Products.php" for a solution</number1></answer></number4><number5><item>Test and make sure the website is running</item><answer><number0>From your browser: http://localhost/sweetscomplete/</number0><number1>Select "Products" and verify you can scan through the list of products</number1><number2>Correct any errors as needed</number2></answer></number5></topic></number12><number13><chap>LAB Solution: C.R.U.D. Operations on &lt;br /&gt;Sweetscomplete Website</chap><topic><number1><item>Solution</item><answer><number0/></answer></number1></topic></number13></c-r-u-d-operations><data-modeling><number1><chap>One to One Relationships: Overview</chap><topic><number1><item>What is a "one to one" relationship?</item><answer><number0>One item maps directly to another item</number0><number1>Example: Person --&gt; Birthdate</number1><number2>Example: Vehicle --&gt; Registration Number</number2></answer></number1><number2><item>When would you use a "one to one" relationship?</item><answer><number0>When the amount of data is too large for a single item</number0><number1>Split the data into separate collections</number1><number2>Provide a common key</number2></answer></number2><number3><item>What is a &lt;i&gt;normalized&lt;/i&gt; data model?</item><answer><number0>Collections of data which share common identifying keys</number0><number1>Customers --&gt; Purchases --&gt; Products</number1></answer></number3><number4><item>How can you build "one to one" relationships in MongoDB?</item><answer><number0>Use either the "manual", the "embedded", or the "DBRef" approach</number0></answer></number4></topic></number1><number2><chap>One to One Relationships: Manual Approach</chap><topic><number1><item>How do you model your data using the "manual" approach?</item><answer><number0>Create separate collections</number0><number1>Create a unique identifying key</number1><number2>Perform two queries</number2></answer></number1><number2><item>How do you store data using the "manual" approach?</item><answer><number0>var id = ObjectId()</number0><number1>db.parent_collection.insert({_id:id, field:value})</number1><number2>db.child_collection.insert({field:value,parent_key:id.toString()})</number2></answer></number2><number3><item>How do you query using the "manual" approach?</item><answer><number0>var parent = db.parent_collection.find({query})</number0><number1>db.child_collection.find({parent_key:parent._id.toString()})</number1></answer></number3></topic></number2><number3><chap>One to One Relationships: Embedded Approach</chap><topic><number1><item>What is an "embedded" document?</item><answer><number0>If you think of a document as an object: &lt;br /&gt;an embedded document is an object within an object</number0><number1>Example: &lt;br /&gt;{name:"Joe",address:&lt;br /&gt;{street:"Main St.",city:"New York"}}</number1></answer></number1><number2><item>How do you store data using the "embedded" approach?</item><answer><number0>Group the data to be embedded in a child document X</number0><number1>Add a field Y in the parent document</number1><number2>Assign the child document X to the field Y</number2></answer></number2><number3><item>How would you query info contained in the embedded document?</item><answer><number0>db.collection.find({"parent_field.child_field":value})</number0></answer></number3></topic></number3><number4><chap>One to One Relationships: DBRef Approach</chap><topic><number1><item>What is a "DBRef"</item><answer><number0>A convention for representing a document in another collection</number0></answer></number1><number2><item>What are the restrictions in using the "DBRef" approach?</item><answer><number0>Not all programming language drivers support this</number0><number1>DBRefs supported in: C#, Java, JavaScript, PHP, Python, Ruby</number1><number2>DBRefs NOT supported in: C, C++ and perl</number2></answer></number2><number3><item>How do you store data using the "DBRef" approach?</item><answer><number0>db.customers.insert({dbref_field:{"$ref":"collection","$id":ObjectId(of linked document),"$db":"database"});</number0></answer></number3><number4><item>How do you query data from a "DBRef"?</item><answer><number0>Use the appropriate class and method supplied by your driver</number0><number1>PHP: MongoCollection::getDBRef</number1></answer></number4></topic></number4><number5><chap>One to Many Relationships: Overview</chap><topic><number1><item>What is a "one to many" relationship?</item><answer><number0>One item maps directly to many related items</number0></answer></number1><number2><item>When would you use a "one to many" relationship?</item><answer><number0>Example: Customer --&gt; Purchases</number0></answer></number2><number3><item>How can you build "one to many" relationships in MongoDB?</item><answer><number0>"Normalized" approach: multiple collections linked with common keys</number0><number1>Using an array of embedded documents</number1><number2>Using an array of DBRef documents</number2></answer></number3></topic></number5><number6><chap>One to Many Relationships: Normalized Approach</chap><topic><number1><item>How do you model your data using the "normalized" approach?</item><answer><number0>Store data in separate collections</number0><number1>Create a unique identifying key</number1><number2>Perform multiple queries</number2></answer></number1><number2><item>How do you store data using the "normalized" approach?</item><answer><number0>var id = ObjectId()</number0><number1>db.parent_collection.insert({_id:id, field:value})</number1><number2>db.child_collection.insert({field:value,parent_key:id.toString()})</number2></answer></number2><number3><item>How do you query using the "normalized" approach?</item><answer><number0>var parent = db.parent_collection.find({query})</number0><number1>db.child_collection.find({parent_key:parent._id.toString()})</number1></answer></number3></topic></number6><number7><chap>One to Many Relationships: Embedded Approach</chap><topic><number1><item>What is an "embedded" document?</item><answer><number0>If you think of a document as an object: &lt;br /&gt;an embedded document is an object within an object</number0><number1>Example: &lt;br /&gt;{name:"Joe",address:&lt;br /&gt;{street:"Main St.",city:"New York"}}</number1></answer></number1><number2><item>How do you store data using the "embedded" approach?</item><answer><number0>Group the data to be embedded in a child document X</number0><number1>Add a field Y in the parent document</number1><number2>Assign the child document X to the field Y</number2></answer></number2><number3><item>How would you query info contained in the embedded document?</item><answer><number0>db.collection.find({"parent_field.child_field":value})</number0></answer></number3></topic></number7><number8><chap>One to Many Relationships: DBRef Approach</chap><topic><number1><item>What is a "DBRef"</item><answer><number0>A convention for representing a document in another collection</number0></answer></number1><number2><item>What are the restrictions in using the "DBRef" approach?</item><answer><number0>Not all programming language drivers support this</number0><number1>DBRefs supported in: C#, Java, JavaScript, PHP, Python, Ruby</number1><number2>DBRefs NOT supported in: C, C++ and perl</number2></answer></number2><number3><item>How do you store data using the "DBRef" approach?</item><answer><number0>var id = ObjectId()</number0><number1>db.child_collection.insert({_id:id, field:value})</number1><number2>db.parent_collection.insert({dbref_field:{"$ref":"parent_collection","$id":id,"$db":name_of_child_database"})</number2></answer></number3><number4><item>How do you query data from a "DBRef"?</item><answer><number0>Use the appropriate class supplied by your driver</number0></answer></number4></topic></number8><number9><chap>Tree structures: Overview</chap><topic><number1><item>What are tree structures?</item><answer><number0>Tree structures represent a hierarchy of items</number0></answer></number1><number2><item>Why would you use tree structures?</item><answer><number0>Use tree structures when the nature of your data is hierarchical</number0></answer></number2><number3><item>What types of tree structures are supported in MongoDB?</item><answer><number0>Parent references</number0><number1>Child references</number1><number2>Array of ancestors</number2><number3>Materialized paths</number3><number4>Nested sets</number4></answer></number3></topic></number9><number10><chap>Tree structures: Parent References</chap><topic><number1><item>What are "parent" references?</item><answer><number0>A special property "parent"</number0><number1>Stores the _id of the document one level up in the tree</number1></answer></number1><number2><item>Why use parent references?</item><answer><number0>Used to navigate tree-structured or hierarchical data</number0></answer></number2><number3><item>How do you implement parent references in MongoDB?</item><answer><number0>When you save a document, include a "parent" property &lt;br /&gt;which stores the _id of the level above</number0></answer></number3></topic></number10><number11><chap>Tree structures: Child References</chap><topic><number1><item>What are "child" references?</item><answer><number0>A special property "children"</number0><number1>Stores an array of _ids of the document one level below in the tree</number1></answer></number1><number2><item>Why use child references?</item><answer><number0>Used to navigate tree-structured or hierarchical data</number0></answer></number2><number3><item>How do you implement child references in MongoDB?</item><answer><number0>When you save a document, include a "children" property &lt;br /&gt;which stores an array _ids one level below</number0></answer></number3><number4><item>Can you have both parent and child references?</item><answer><number0>Yes, as shown in the example</number0></answer></number4></topic></number11><number12><chap>LAB Instructions: Build One to Many Model for Purchases</chap><topic><number1><item>Import sweetscomplete "Members" data into MongoDB</item><answer><number0>mongoimport -d sweetscomplete -c members --headerline --type csv &lt;br /&gt;--file /path/to/document/root/Model/sweetscomplete_members.csv</number0></answer></number1><number2><item>Rewrite "Model/Members.php" to use MongoDB instead of a CSV file</item><answer><number0>Look for comments starting with "// ***" for clues</number0><number1>Check the Working Files folder "sweetscomplete.complete/Model/Members.php" for a solution</number1></answer></number2><number3><item>Embed purchases into the "members" collection</item><answer><number0>Complete "Model/purchases_into_members.php"</number0><number1>Run the script to move purchase history into "members"</number1></answer></number3><number4><item>Rewrite the "getHistoryById()" method</item><answer><number0>Copy the "getHistoryById()" method from "Purchases.php" into "Members.php"</number0><number1>Rewrite using MongoDB</number1></answer></number4><number5><item>Modify "View/members.php"</item><answer><number0>Rewrite using named params instead of offset numbers &lt;br /&gt;(i.e. "user_id" instead of 0, etc.)</number0></answer></number5><number6><item>Modify "View/change.php"</item><answer><number0>Use "$member" instance instead of "$purchases" to call "getHistoryById()"</number0></answer></number6><number7><item>Test and make sure the website is running</item><answer><number0>From your browser: http://localhost/sweetscomplete/</number0><number1>Select "Members" (top right) and verify you can scan through the list of members</number1><number2>Login as "admin@sweetscomplete.com"</number2><number3>Select "Admin" and view purchase history for a member</number3><number4>Correct any errors as needed</number4></answer></number7></topic></number12><number13><chap>LAB Solution: Build One to Many Model for Purchases -- Part 1</chap><topic><number1><item>Solution</item><answer><number0/></answer></number1></topic></number13><number14><chap>LAB Solution: Build One to Many Model for Purchases -- Part 2</chap><topic><number1><item>Solution</item><answer><number0/></answer></number1></topic></number14></data-modeling><database-management><number1><chap>&lt;b&gt;Database Security Overview&lt;/b&gt;</chap><topic><number1><item>How do you enable authentication?</item><answer><number0>Authentication is disabled by default</number0><number1>Configure the &lt;i&gt;mongod.conf&lt;/i&gt; file</number1><number2>Set the &lt;i&gt;auth&lt;/i&gt; mongod.conf setting to "true"</number2><number3>For replica set security: set the &lt;i&gt;keyFile&lt;/i&gt; setting</number3></answer></number1><number2><item>How do you use &lt;i&gt;auth&lt;/i&gt; setting?</item><answer><number0>Set the &lt;i&gt;auth&lt;/i&gt; mongod.conf param to &lt;i&gt;true&lt;/i&gt;</number0><number1>Restart &lt;i&gt;mongod&lt;/i&gt;</number1><number2>If no users are in the &lt;i&gt;admin&lt;/i&gt; database, localhost access is allowed</number2></answer></number2><number4><item>What are the user privilege roles?</item><answer><number0>What a user can do with the database</number0><number1>read, readWrite</number1></answer></number4><number5><item>What are the database admin roles?</item><answer><number0>How a user can manage the database, users, or cluster</number0><number1>dbAdmin, userAdmin, clusterAdmin</number1></answer></number5><number6><item>What are the "Any" privileges?</item><answer><number0>[read|readWrite|userAdmin|dbAdmin]AnyDatabase</number0></answer></number6></topic></number1><number2><chap>How to Add Database and User Administrators</chap><topic><number1><item>How do you add an overall admin user?</item><answer><number0>Edit mongod.conf and set &lt;i&gt;auth=true&lt;/i&gt;</number0><number1>Restart &lt;i&gt;mongod&lt;/i&gt;</number1><number2>Access mongodb using the &lt;i&gt;mongo&lt;/i&gt; shell</number2><number3>use admin</number3><number4>db.addUser("admin","password")</number4></answer></number1><number2><item>How do you add a user administrator?</item><answer><number0>&lt;b&gt;For one database:&lt;/b&gt;</number0><number1>use db-name</number1><number2>db.addUser({user:"xxx",pwd:"xxx",roles:["userAdmin"]})</number2><number3>&lt;b&gt;For any database:&lt;/b&gt;</number3><number4>use admin</number4><number5>db.addUser({user:"xxx",pwd:"xxx",roles:["userAdminAnyDatabase"]})</number5></answer></number2><number3><item>How do you add a database administrator?</item><answer><number0>&lt;b&gt;For one database:&lt;/b&gt;</number0><number1>use db-name</number1><number2>db.addUser({user:"xxx",pwd:"xxx",roles:["dbAdmin"]})</number2><number3>&lt;b&gt;For any database:&lt;/b&gt;</number3><number4>use admin</number4><number5>db.addUser({user:"xxx",pwd:"xxx",roles:["dbAdminAnyDatabase"]})</number5></answer></number3><number4><item>How do you perform actions on other databases?</item><answer><number0>use admin</number0><number1>db.addUser({user:"xxx",pwd:"xxx",roles:[],otherDBRoles:&lt;br /&gt;{db-user:["role"],next-db-user:["role","role"],etc.})</number1></answer></number4></topic></number2><number3><chap>Managing Users</chap><topic><number1><item>How do you add a user to a single database?</item><answer><number0>use db-name</number0><number1>db.addUser({user:"xxx",pwd:"xxx",roles:["read|readWrite"]})</number1></answer></number1><number2><item>How do you add a user to a multiple databases?</item><answer><number0>use admin</number0><number1>db.addUser({user:"xxx",pwd:"xxx",roles:[],otherDBRoles:&lt;br /&gt;{db-name:["read|readWrite"],other-db-name:["read|readWrite"],etc.}})</number1></answer></number2><number3><item>How do you get a list of database users?</item><answer><number0>Login as a user admin</number0><number1>use db-name</number1><number2>db.system.users.find()</number2></answer></number3><number4><item>How do you change a user password?</item><answer><number0>Authenticate as user admin</number0><number1>use db-name</number1><number2>db.changeUserPassword("username","new-password")</number2></answer></number4><number5><item>How do you modify user privileges?</item><answer><number0>Login as a user admin</number0><number1>use db-name</number1><number2>db.system.users.update({user:"xxx"},{$set:{roles:["readWrite",etc.]}})</number2></answer></number5><number6><item>How do you get rid of a user?</item><answer><number0>Login as a user admin</number0><number1>use db-name</number1><number2>db.system.users.find({user:"name"})</number2><number3>db.removeUser("name")</number3></answer></number6></topic></number3><number4><chap>Authenticating and Handling Errors</chap><topic><number1><item>How do you authenticate from outside the MongoDB shell?</item><answer><number0>mongo -u name -p password --authenticationDatabase db-name</number0></answer></number1><number2><item>How do you authenticate from inside the MongoDB shell?</item><answer><number0>use db-name</number0><number1>db.auth("name","password")</number1></answer></number2><number3><item>How do you authenticate from an application?</item><answer><number0>Depends on your driver</number0><number1>PHP: $client = new MongoClient("mongodb://username:password@localhost/db-name")</number1></answer></number3><number4><item>What errors might you see and how can they be resolved?</item><answer><number0>&lt;b&gt;Insufficient rights to perform an operation:&lt;/b&gt;</number0><number1>"$err" : "not authorized for query on db-name.system.namespaces"</number1><number2>XXX failed:{ "ok" : 0, "errmsg" : "unauthorized" }</number2><number3>&lt;b&gt;Did not provide authentication database&lt;/b&gt;</number3><number4>Error: 18 { code: 18, ok: 0.0, errmsg: "auth fails" }</number4><number5>&lt;b&gt;Incorrect credentials in application:&lt;/b&gt;</number5><number6>Uncaught exception XXX ... "localhost:27017: not authorized for XXX on YYY.ZZZ"</number6></answer></number4><number5><item>How do you regain access to a database?</item><answer><number0>Disable &lt;i&gt;auth&lt;/i&gt; in mongod.conf</number0><number1>Restart &lt;i&gt;mongod&lt;/i&gt;</number1><number2>use db-name</number2><number3>db.system.users.remove()</number3></answer></number5><number6><item>Where can you find more information?</item><answer><number0>docs.mongodb.org/manual/tutorial/enable-authentication</number0><number1>docs.mongodb.org/manual/reference/configuration-options</number1></answer></number6></topic></number4><number5><chap>&lt;b&gt;Replication Overview&lt;/b&gt;</chap><topic><number1><item>What is replication?</item><answer><number0>Copies of the same data on different servers</number0></answer></number1><number2><item>When would you use replication?</item><answer><number0>Provides redundancy</number0><number1>Safeguards data when a server goes down</number1></answer></number2><number3><item>What is a &lt;i&gt;primary&lt;/i&gt;?</item><answer><number0>The &lt;i&gt;primary&lt;/i&gt; is the &lt;i&gt;mongod&lt;/i&gt; instance which accepts read and write requests for the data set</number0></answer></number3><number4><item>What are &lt;i&gt;secondaries&lt;/i&gt;?</item><answer><number0>&lt;i&gt;Secondaries&lt;/i&gt; store a backup copy of the data set held by the &lt;i&gt;primary&lt;/i&gt;</number0></answer></number4><number5><item>What happens when a &lt;i&gt;primary&lt;/i&gt; fails?</item><answer><number0>The &lt;i&gt;secondaries&lt;/i&gt; elect a new primary</number0></answer></number5><number6><item>When would you use an &lt;i&gt;arbiter&lt;/i&gt;</item><answer><number0>An &lt;i&gt;arbiter&lt;/i&gt; is a &lt;i&gt;mongod&lt;/i&gt; instance which holds no data</number0><number1>Use an &lt;i&gt;arbiter&lt;/i&gt; if you have an even number of &lt;i&gt;secondaries&lt;/i&gt;</number1><number2>The &lt;i&gt;arbiter&lt;/i&gt; has "voting rights" to help decide ties</number2></answer></number6><number7><item>How can "reads" take advantage of replication?</item><answer><number0>&lt;b&gt;Read preference modes which can be set:&lt;/b&gt;</number0><number1>primary, primaryPreferred</number1><number2>secondary, secondaryPreferred, nearest</number2></answer></number7><number8><item>How many MongoDB instances should go into a replica set?</item><answer><number0>A minimum of 3 is recommended: &lt;br /&gt;1 primary and 2 secondaries</number0><number1>There is no upper limit</number1><number2>Objective: redundancy</number2><number3>Geographic considerations may apply</number3></answer></number8></topic></number5><number6><chap>Configuring a Replica Set: Adding the First Member</chap><topic><number1><item>How do you start?</item><answer><number0>Backup any existing data</number0><number1>Recommended: start with a fresh MongoDB installation</number1></answer></number1><number2><item>How do you configure replica set names?</item><answer><number0>Add an entry to DNS or the local "/etc/hosts" file</number0><number1>Example: mongo0rs0.company.com = replica set rs0, 1st server</number1><number2>Make sure you can connect to the secondaries</number2></answer></number2><number3><item>How do you configure the &lt;i&gt;mongod.conf&lt;/i&gt; file?</item><answer><number0>Set the parameters as appropriate to your system</number0><number1>Comment out &lt;b&gt;bind_ip&lt;/b&gt; to allow MongoDB to respond to all network cards</number1><number2>You must configure the &lt;b&gt;replSet&lt;/b&gt; parameter</number2><number3>Example: &lt;b&gt;replSet=rs0&lt;/b&gt;</number3><number4>Do not set &lt;b&gt;priority&lt;/b&gt; here!</number4><number5>Master/Slave configuration is not recommended: use replica sets</number5></answer></number3><number4><item>What is the startup sequence?</item><answer><number0>Restart MongoDB</number0><number1>Access the &lt;i&gt;mongo&lt;/i&gt; shell</number1><number2>Authenticate if necessary</number2><number3>Initialize: &lt;b&gt;rs.initiate()&lt;/b&gt;</number3></answer></number4><number5><item>How do you know the replica set is running?</item><answer><number0>Access the &lt;i&gt;mongo&lt;/i&gt; shell</number0><number1>The command prompt should reflect the status</number1><number2>View status: &lt;b&gt;rs.status()&lt;/b&gt;</number2><number3>View config: &lt;b&gt;rs.conf()&lt;/b&gt;</number3></answer></number5></topic></number6><number7><chap>Configuring a Replica Set: Adding a Secondary</chap><topic><number1><item>How do you start?</item><answer><number0>Make sure MongoDB is installed but stopped</number0><number1>Add an entry to DNS or the local "/etc/hosts" file to identify all replica hosts</number1><number2>Example: mongo0rs0.company.com, mongo1rs0.company.com, etc.</number2><number3>Ensure that the secondary can connect to the primary</number3></answer></number1><number2><item>How many MongoDB instances should go into a set?</item><answer><number0>A minimum of 3 is recommended: &lt;br /&gt;1 primary and 2 secondaries</number0><number1>Maximum of 7 "voting" members</number1><number2>Add as many non-voting members as desired</number2><number3>Set &lt;b&gt;priority=0&lt;/b&gt; to make a member non-voting</number3></answer></number2><number3><item>How do you configure the &lt;i&gt;mongod.conf&lt;/i&gt; file?</item><answer><number0>Set the parameters as appropriate to your system</number0><number1>Comment out &lt;b&gt;bind_ip&lt;/b&gt; to allow MongoDB to respond to all network cards</number1><number2>You must configure the &lt;b&gt;replSet&lt;/b&gt; parameter</number2><number3>Example: &lt;b&gt;replSet=rs0&lt;/b&gt;</number3><number4>Do not set &lt;b&gt;priority&lt;/b&gt; here!</number4><number5>Master/Slave configuration is not recommended: use replica sets</number5></answer></number3><number4><item>How do you initialize the secondary?</item><answer><number0>Follow one of these strategies:</number0><number1>&lt;b&gt;1A&lt;/b&gt; backup the /data/db folder of the primary</number1><number2>&lt;b&gt;1B&lt;/b&gt; restore to the /data/db folder of the secondary</number2><number3>OR &lt;b&gt;2A&lt;/b&gt; remove all files and folders from the /data/db folder of the secondary</number3></answer></number4><number5><item>What needs to be done on the primary?</item><answer><number0>Add an entry to DNS or the local "/etc/hosts" file to identify the secondaries</number0><number1>Example: mongo1rs0.company.com, mongo2rs0.company.com, etc.</number1><number2>From the &lt;i&gt;mongo&lt;/i&gt; command shell on the primary:</number2><number3>rs.add("dns.address|hostname")</number3><number4>Wait for the synchronization to occur</number4></answer></number5><number6><item>How do you know the replica set is running?</item><answer><number0>Access the &lt;i&gt;mongo&lt;/i&gt; shell</number0><number1>The command prompt should reflect the status</number1><number2>View status: &lt;b&gt;rs.status()&lt;/b&gt;</number2><number3>View config: &lt;b&gt;rs.conf()&lt;/b&gt;</number3></answer></number6></topic></number7><number8><chap>Configuring a Replica Set: Reconfiguring or Removing</chap><topic><number1><item>How do you set "primary" or "secondary"?</item><answer><number0>An up-to-date MongoDB instance with the &lt;br /&gt;highest &lt;b&gt;priority&lt;/b&gt; setting will become the Primary</number0></answer></number1><number2><item>How do you use &lt;b&gt;rs.reconfig()&lt;/b&gt; to set the priority?</item><answer><number0>View config: &lt;b&gt;rs.conf()&lt;/b&gt;</number0><number1>Make a note of the &lt;b&gt;_id&lt;/b&gt; number under members</number1><number2>Assign config to a variable: &lt;b&gt;config = rs.conf()&lt;/b&gt;</number2><number3>Set the priority: &lt;b&gt;config.members[X].priority=N&lt;/b&gt;</number3><number4>Where &lt;b&gt;X&lt;/b&gt; is the member _id to change</number4><number5>and where &lt;b&gt;N&lt;/b&gt; is the priority number</number5><number6>Reconfigure: &lt;b&gt;rs.reconfig(config)&lt;/b&gt;</number6></answer></number2><number3><item>How else can you use &lt;b&gt;rs.reconfig()&lt;/b&gt;?</item><answer><number0>Remove replica set members</number0><number1>Rename DNS or hostnames</number1></answer></number3><number4><item>What has to be done before removing a member?</item><answer><number0>Stop MongoDB on the replica set member to be removed</number0><number1>Disable the &lt;b&gt;replSet&lt;/b&gt; setting in the mongod.conf file</number1></answer></number4><number5><item>How do you use &lt;b&gt;rs.remove()&lt;/b&gt;?</item><answer><number0>Connect to the Primary</number0><number1>Use &lt;b&gt;db.isMaster()&lt;/b&gt; to ensure the replica member is the Primary</number1><number2>&lt;b&gt;Type:&lt;/b&gt; rs.remove("dns.address|hostname")</number2><number3>&lt;b&gt;Or:&lt;/b&gt; rs.remove("dns.address|hostname:port")</number3></answer></number5><number6><item>How do you force a member to become primary?</item><answer><number0>From the mongo shell of the current primary: &lt;b&gt;rs.stepDown(120)&lt;/b&gt;</number0><number1>From the mongo shell of the undesired secondaries: &lt;b&gt;rs.freeze(120)&lt;/b&gt;</number1><number2>The remaining secondary will become primary</number2><number3>Alternatively:</number3><number4>use local</number4><number5>db.system.replset.update({_id:"rs0"},{$set:{members:[{_id:0,host:"HOSTNAME:27017"}]}})</number5></answer></number6></topic></number8><number9><chap>Replica Set Troubleshooting</chap><topic><number1><item>What if you have two primaries?</item><answer><number0>You can run &lt;b&gt;rs.initiate()&lt;/b&gt; ONLY on the first member of the replica set!</number0><number1>On the secondary which acts like a primary, clear the folder indicated by &lt;b&gt;dbpath&lt;/b&gt;</number1><number2>Restart the secondary</number2></answer></number1><number2><item>What if the primary can "see" the secondary, &lt;br /&gt;but not the other way around?</item><answer><number0>Run &lt;b&gt;rs.conf()&lt;/b&gt; and make sure all servers can access all hostnames</number0><number1>Check firewall settings</number1></answer></number2><number3><item>What about firewall settings?</item><answer><number0>You need to allow an exception for MongoDB</number0><number1>Messages you might see when attempting to sync:</number1><number2>&lt;b&gt;SELinux:&lt;/b&gt; security alert</number2><number3>&lt;b&gt;Windows:&lt;/b&gt; Windows Firewall alert</number3></answer></number3><number4><item>What if replicas are not syncing?</item><answer><number0>&lt;b&gt;FIRST:&lt;/b&gt; run rs.conf()</number0><number1>Make sure all hostnames are entered into DNS</number1><number2>or in the local "hosts" file of all computers in the replica set</number2><number3>&lt;b&gt;THEN TRY:&lt;/b&gt;</number3><number4>ping hostname|DNS name</number4><number5>mongo --host hostname|DNS name --port 27017</number5><number6>Correct any communcations errors</number6></answer></number4><number5><item>What if you have only one secondary?</item><answer><number0>use local</number0><number1> db.system.replset.update({_id:"XXX"},{$set:{members:[{_id:0,host:"HHH:27017"}]}})</number1><number2>Where "XXX" is the replica set ID</number2><number3>and "HHH" is the hostname of the secondary</number3><number4>Restart MongoDB</number4></answer></number5><number6><item>How can you get more information?</item><answer><number0>docs.mongodb.org/manual/tutorial/troubleshoot-replica-sets/</number0></answer></number6></topic></number9><number10><chap>&lt;b&gt;Sharding Overview&lt;/b&gt;</chap><topic><number1><item>What is "sharding"?</item><answer><number0>Splitting a single collection among several MongoDB instances</number0><number1>In production, each shard should be a &lt;b&gt;replica set&lt;/b&gt;</number1></answer></number1><number2><item>Why would you use sharding?</item><answer><number0>When a collection becomes too large for a single server</number0></answer></number2><number3><item>What is a "sharded cluster"?</item><answer><number0>A combination of the following:</number0><number1>MongoDB Shard Routing Service (mongos)</number1><number2>Configuration Server</number2><number3>Two or more shards</number3></answer></number3><number4><item>How is key space allocated?</item><answer><number0>Range based</number0><number1>Hash function based</number1></answer></number4><number5><item>How should you choose a shard key?</item><answer><number0>The key should be:</number0><number1>Relatively random, and</number1><number2>Provide for an even distribution of data</number2></answer></number5></topic></number10><number11><chap>Implementing Sharding</chap><topic><number1><item>How do you start the &lt;i&gt;config server(s)&lt;/i&gt;?</item><answer><number0>In production have 3 separate config servers</number0><number1>Add a DNS or "hosts" file host name for each config server</number1><number2>Make a data folder (i.e. /data/configdb)</number2><number3>mongod --configsvr --dbpath path-to-data-folder --port 27019</number3></answer></number1><number2><item>How do you start the &lt;i&gt;mongos&lt;/i&gt; instance(s)?</item><answer><number0>Assign a DNS or "hosts" file name to the &lt;i&gt;mongos&lt;/i&gt; instance</number0><number1>mongos --port 27018 --configdb config-server-host-1, config-server-host-2, etc.</number1></answer></number2><number3><item>How do you add shards to the cluster?</item><answer><number0>&lt;b&gt;Connect to the &lt;i&gt;mongos&lt;/i&gt; instance:&lt;/b&gt;</number0><number1>mongo --host mongos-hostname --port 27018</number1><number2>&lt;b&gt;Add shard to stand-alone MongoDB instance:&lt;/b&gt;</number2><number3>sh.addShard("hostname:port")</number3><number4>&lt;b&gt;Add shard to a MongoDB replica set:&lt;/b&gt;</number4><number5>sh.addShard("rs/hostname:port")</number5><number6>Where "rs" is the replica set identifier</number6></answer></number3><number4><item>How do you enable sharding for a database?</item><answer><number0>&lt;b&gt;Connect to the &lt;i&gt;mongos&lt;/i&gt; instance:&lt;/b&gt;</number0><number1>mongo --host mongos-hostname --port 27018</number1><number2>&lt;b&gt;Enable sharding for database "db-name":&lt;/b&gt;</number2><number3>sh.enableSharding("db-name")</number3></answer></number4><number5><item>How do you enable sharding for a collection</item><answer><number0>Identify one or more fields to be used as the &lt;i&gt;shard key&lt;/i&gt;</number0><number1>If the collection contains data:</number1><number2>Create an index on the shard key field(s): &lt;b&gt;ensureIndex()&lt;/b&gt;</number2><number3>&lt;i&gt;Enable sharding for the collection:&lt;/i&gt;</number3><number4>sh.shardCollection("db-name.collection",{shard_key_field_1: 1 [,shard_key_field_2: 1]})</number4></answer></number5><number6><item>How can you confirm sharding is successful?</item><answer><number0>&lt;b&gt;Connect to the &lt;i&gt;mongos&lt;/i&gt; instance:&lt;/b&gt;</number0><number1>mongo --host mongos-hostname --port 27018</number1><number2>sh.status()</number2></answer></number6></topic></number11><number12><chap>&lt;b&gt;Indexing and Performance Considerations&lt;/b&gt;</chap><topic><number1><item>How does an index affect performance?</item><answer><number0>Indexes will greatly enhance database queries</number0></answer></number1><number2><item>How do you create an index?</item><answer><number0>Create an index on fields usually involved in queries</number0><number1>&lt;i&gt;db.collection.ensureIndex({field(s)})&lt;/i&gt;</number1></answer></number2><number3><item>How can you reduce MongoDB file sizes?</item><answer><number0>MongoDB pre-allocates space to increase speed</number0><number1>Change the &lt;i&gt;smallfiles&lt;/i&gt; setting in &lt;i&gt;mongod.conf&lt;/i&gt;</number1></answer></number3><number4><item>How can you reduce the overhead for each document?</item><answer><number0>By default &lt;i&gt;_id&lt;/i&gt; is a 12 byte ObjectId</number0><number1>Explicitly set &lt;i&gt;_id&lt;/i&gt; to a smaller value</number1><number2>Keep field names short</number2><number3>Use embedded documents as much as possible</number3></answer></number4><number5><item>What about using GridFS for large files?</item><answer><number0>Store large files as &lt;i&gt;GridFS&lt;/i&gt; objects</number0><number1>Works well for files larger than 16MB in size</number1><number2>Use the &lt;i&gt;mongofiles&lt;/i&gt; command from the command line</number2><number3>From an application, usage varies</number3><number4>PHP uses the &lt;i&gt;MongoGridFS&lt;/i&gt; class</number4><number5>More info: docs.mongodb.org/manual/core/gridfs/&lt;br /&gt;docs.mongodb.org/manual/reference/program/mongofiles/</number5></answer></number5><number6><item>What affect does replication have on performance?</item><answer><number0>Read concerns allow you to influence which replica set responds</number0><number1>Read concerns can potentially improve performance</number1></answer></number6><number7><item>What affect do "write concerns" have on performance?</item><answer><number0>Strengthening write concerns will improve reliability but reduce performance</number0></answer></number7></topic></number12><number13><chap>Backup Procedures</chap><topic><number1><item>How do you backup a database?</item><answer><number0>&lt;b&gt;mongodump&lt;/b&gt;</number0><number1>Backing up the &lt;i&gt;dbpath&lt;/i&gt; folder</number1><number2>From the &lt;i&gt;mongo&lt;/i&gt; shell:</number2><number3>Copy local database: &lt;b&gt;db.copyDatabase()&lt;/b&gt;</number3><number4>Copy remote database: &lt;b&gt;db.cloneDatabase()&lt;/b&gt;</number4><number5>OR: use a replica set!</number5></answer></number1><number2><item>How do you restore data?</item><answer><number0>&lt;b&gt;mongorestore&lt;/b&gt;</number0><number1>Restoring up the &lt;i&gt;dbpath&lt;/i&gt; folder</number1></answer></number2><number3><item>How do you backup a single collection</item><answer><number0>&lt;b&gt;Command line:&lt;/b&gt;</number0><number1>mongoexport -d db-name -c collection-name --out export-file [--csv]</number1><number2>From the &lt;i&gt;mongo&lt;/i&gt; shell:</number2><number3>db.cloneCollection()</number3></answer></number3><number4><item>How do you restore a single collection</item><answer><number0>&lt;b&gt;Command line:&lt;/b&gt;</number0><number1>mongoimport -d db-name -c collection-name --file export-file --type csv|json [--headerline]</number1></answer></number4><number5><item>How do you repair data?</item><answer><number0>Login as a database admin</number0><number1>use db-name</number1><number2>db.repairDatabase()</number2></answer></number5><number6><item>How can sharding and replication affect backups?</item><answer><number0>Backing up and restoring individual shards or members of a replica set can pose problems</number0><number1>Make sure you backup or restore the &lt;b&gt;entire&lt;/b&gt; database on that server</number1><number2>If possible, make sure no write operations are taking place</number2></answer></number6></topic></number13><number14><chap>Monitoring MongoDB</chap><topic><number1><item>MongoDB command shell</item><answer><number0>db.stats()</number0><number1>db.serverStatus()</number1></answer></number1><number2><item>Command line</item><answer><number0>mongostat</number0><number1>mongotop</number1></answer></number2><number3><item>Using management tools</item><answer><number0>MongoBird</number0><number1>RockMongo:</number1><number2>Make sure authentication is enabled</number2><number3>Edit /path/to/rockmongo/config.php and set &lt;br /&gt;$MONGO["servers"][$i]["mongo_auth"] = true;</number3></answer></number3><number4><item>How do you monitor the state of the replica set?</item><answer><number0>From the &lt;i&gt;mongo&lt;/i&gt; shell:</number0><number1>rs.status()</number1><number2>rs.conf()</number2></answer></number4></topic></number14><number15><chap>LAB Instructions: Manage MongoDB Database for Sweetscomplete</chap><topic><number1><item>Configure MongoDB for authentication</item><answer><number0>Modify the MongoDB config file</number0><number1>Set the "auth" parameter to "true"</number1><number2>Restart MongoDB</number2></answer></number1><number2><item>Create an admin database user</item><answer><number0>Access the &lt;b&gt;mongo&lt;/b&gt; command shell</number0><number1>use admin</number1><number2>db.addUser("admin","password")</number2></answer></number2><number3><item>Create a user with "readWrite" privileges</item><answer><number0>From the &lt;b&gt;mongo&lt;/b&gt; shell as an admin user:</number0><number1>use sweetscomplete</number1><number2>db.addUser({user:"sweet",pwd:"password",roles:[{"readWrite"}]})</number2></answer></number3><number4><item>Verify the website no longer works</item><answer><number0>From your browser: http://localhost/sweetscomplete</number0><number1>The website should no longer be working</number1></answer></number4><number5><item>Add authentication to "Products.php" and "Members.php"</item><answer><number0>Modify the "getClient()" method in "Model/Products.php" and "Model/Members.php"</number0><number1>Add a connection string: new MongoClient("mongodb://sweet:password@localhost/sweetscomplete")</number1></answer></number5><number6><item>Add indexes to improve performance</item><answer><number0>Go into the &lt;b&gt;mongo&lt;/b&gt; shell (with authentication)</number0><number1>use sweetscomplete</number1><number2>db.products.ensureIndex({product_id:1})</number2><number3>Establish indexes for these "products" fields:</number3><number4>title, special</number4><number5>Establish indexes for these "members" fields:</number5><number6>user_id, email</number6></answer></number6><number7><item>Backup the Sweetscomplete database</item><answer><number0>From the command line: &lt;b&gt;mongodump&lt;/b&gt;</number0></answer></number7><number8><item>Monitor the Sweetscomplete database</item><answer><number0>From the command line: </number0><number1>&lt;b&gt;mongostat&lt;/b&gt;</number1><number2>&lt;b&gt;mongotop&lt;/b&gt;</number2></answer></number8></topic></number15><number16><chap>LAB Solution: Manage MongoDB Database for Sweetscomplete</chap><topic><number1><item>Solution</item><answer><number0/></answer></number1></topic></number16></database-management></outline></mongo-db></subject></unlikely-outliner></root>
