<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=MongoDB_for_Developers</id>
	<title>MongoDB for Developers - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=MongoDB_for_Developers"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=MongoDB_for_Developers&amp;action=history"/>
	<updated>2026-06-02T21:24:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://training-course-material.com/index.php?title=MongoDB_for_Developers&amp;diff=81932&amp;oldid=prev</id>
		<title>Kbaran: /* Data models ⌘ */</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=MongoDB_for_Developers&amp;diff=81932&amp;oldid=prev"/>
		<updated>2021-04-12T22:45:44Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Data models ⌘&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:MongoDB]]&lt;br /&gt;
&lt;br /&gt;
{{Copyright Notice}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;noprint&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;slideshow style=&amp;quot;nobleprog&amp;quot; headingmark=&amp;quot;⌘&amp;quot; incmark=&amp;quot;…&amp;quot; scaled=&amp;quot;false&amp;quot; font=&amp;quot;Trebuchet MS&amp;quot; &amp;gt;&lt;br /&gt;
;title: MongoDB for Developers&lt;br /&gt;
;author: Kamil Baran&lt;br /&gt;
&amp;lt;/slideshow&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Basics of MongoDB}}&lt;br /&gt;
&lt;br /&gt;
== Querying ⌘==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Select ⌘===&lt;br /&gt;
* find, findOne&lt;br /&gt;
* parameters: query, fields, limit, skip, sort, batchSize, options&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.people.find()&lt;br /&gt;
&amp;gt; db.people.find({&amp;quot;Nationality&amp;quot; : &amp;quot;Great Britain&amp;quot;})&lt;br /&gt;
&amp;gt; db.people.find({&amp;quot;Nationality&amp;quot; : &amp;quot;Great Britain&amp;quot;, &amp;quot;occupation&amp;quot; : &amp;quot;actor&amp;quot;})&lt;br /&gt;
&amp;gt; db.people.find({&amp;quot;_id&amp;quot; : ObjectId(&amp;quot;545a36577907b2a255b156c4&amp;quot;)})&lt;br /&gt;
&amp;gt; db.people.findOne({}, {&amp;quot;Name&amp;quot; : 1, &amp;quot;Nationality&amp;quot; : 1})&lt;br /&gt;
&amp;gt; db.people.findOne({}, {&amp;quot;Name&amp;quot; : 1, &amp;quot;Nationality&amp;quot; : 1, &amp;quot;_id&amp;quot; : 0})&lt;br /&gt;
&amp;gt; db.people.find().limit(3).skip(5).sort({&amp;quot;BirthYear&amp;quot; : -1})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Query Criteria ⌘===&lt;br /&gt;
* $lt, $lte, $gt, $gte, $eq, $ne&lt;br /&gt;
* $in, $nin, $or (whenever possible use $in instead of $or)&lt;br /&gt;
* $not, $mod&lt;br /&gt;
* handling null value, $exists&lt;br /&gt;
* Perl Compatible Regular Expressions are allowed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.people.find({Nationality : &amp;quot;USA&amp;quot;, BirthYear : {$lte : 1950}})&lt;br /&gt;
&amp;gt; db.people.find({Nationality : &amp;quot;USA&amp;quot;, BirthYear : {$gte : 1940, $lte : 1950}})&lt;br /&gt;
&amp;gt; db.people.find({Nationality : {$in : [&amp;quot;Belgium&amp;quot;, &amp;quot;Israel&amp;quot;]}})&lt;br /&gt;
&amp;gt; db.people.find({$or : [{Nationality : &amp;quot;Belgium&amp;quot;}, {Nationality : &amp;quot;Israel&amp;quot;}]})&lt;br /&gt;
&amp;gt; db.people.find({BirthYear : {$mod : [10, 0]}})&lt;br /&gt;
&amp;gt; db.people.find({BirthYear : {$not : {$mod : [10, 0]}}})&lt;br /&gt;
&amp;gt; db.people.find({Nationality : null})&lt;br /&gt;
&amp;gt; db.people.find({Nationality : {$exists : 1, $eq : null}})&lt;br /&gt;
&amp;gt; db.people.find({Name : /east/i})&lt;br /&gt;
&amp;gt; db.people.find({Name : /^A/})&lt;br /&gt;
&amp;gt; db.people.find({Occupation : /^actor$/i}, {Occupation:1, Name:1, _id:0})&lt;br /&gt;
&amp;gt; db.people.find({Name : /^cli.*.wood$/i}, {Name:1, _id:0})&lt;br /&gt;
&amp;gt; db.people.find({Name : /^clint eastw..d$/i}, {Name:1, _id:0})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Query Criteria for Arrays ⌘===&lt;br /&gt;
* behave in the same way as scalars&lt;br /&gt;
* $all, $size (can not be combined with other criterias)&lt;br /&gt;
* $slice, $-operator, * $elemMatch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.people.find({Occupation : &amp;quot;Actor&amp;quot;}, {Name : 1, Occupation : 1})&lt;br /&gt;
&amp;gt; db.people.find({Occupation : [&amp;quot;Actress&amp;quot;]})&lt;br /&gt;
&amp;gt; db.people.find({Occupation : {$all : [&amp;quot;Actress&amp;quot;, &amp;quot;Producer&amp;quot;]}})&lt;br /&gt;
&amp;gt; db.people.find({&amp;quot;Occupation.1&amp;quot; : &amp;quot;Producer&amp;quot;})&lt;br /&gt;
&amp;gt; db.people.find({Occupation : {$size : 3}})&lt;br /&gt;
&amp;gt; db.people.find({Name: &amp;quot;Sean Connery&amp;quot;}, {Movie : {$slice : -1}})&lt;br /&gt;
&amp;gt; db.people.find({&amp;quot;Movie.Title&amp;quot; : &amp;quot;Never Say Never Again&amp;quot;})&lt;br /&gt;
&amp;gt; db.people.find({&amp;quot;Movie.Title&amp;quot; : &amp;quot;Never Say Never Again&amp;quot;}, {&amp;quot;Movie.$&amp;quot; : 1})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Query on Embedded Document ⌘===&lt;br /&gt;
* query for entire document&lt;br /&gt;
* query for selected key/value pairs&lt;br /&gt;
* $elemMatch&lt;br /&gt;
* watch out for the dots (.) in keys names&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.people.findOne({&amp;quot;BirthPlace&amp;quot; : {&amp;quot;Country&amp;quot; : &amp;quot;United Kingdom, Scotland&amp;quot;, &amp;quot;City&amp;quot; : &amp;quot;Edinburgh&amp;quot;}})&lt;br /&gt;
&amp;gt; db.people.findOne({&amp;quot;BirthPlace&amp;quot; : {&amp;quot;City&amp;quot; : &amp;quot;Edinburgh&amp;quot;, &amp;quot;Country&amp;quot; : &amp;quot;United Kingdom, Scotland&amp;quot;}})&lt;br /&gt;
&amp;gt; db.people.findOne({&amp;quot;BirthPlace.City&amp;quot; : &amp;quot;Edinburgh&amp;quot;, &amp;quot;BirthPlace.Country&amp;quot; : &amp;quot;United Kingdom, Scotland&amp;quot;})&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; db.people.find({&amp;quot;Movie._id&amp;quot; : ObjectId(&amp;quot;545a5f167907b2a255b156c7&amp;quot;), &amp;quot;Movie.Title&amp;quot; : &amp;quot;Never Say Never Again&amp;quot;})&lt;br /&gt;
&amp;gt; db.people.find({&amp;quot;Movie&amp;quot; : {&amp;quot;$elemMatch&amp;quot; : {&amp;quot;_id&amp;quot; : ObjectId(&amp;quot;545a5f167907b2a255b156c7&amp;quot;), &amp;quot;Title&amp;quot; : &amp;quot;Never Say Never Again&amp;quot;}}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using $where ⌘===&lt;br /&gt;
* $where allows to run arbitrary JavaScript as part of a query&lt;br /&gt;
* powerful, slow, only for trusted users, can not use indexes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.test_where.insert([{&amp;quot;ordered&amp;quot; : 10, &amp;quot;sent&amp;quot; : 0}, {&amp;quot;ordered&amp;quot; : 10, &amp;quot;sent&amp;quot; : 5}, {&amp;quot;ordered&amp;quot; : 10, &amp;quot;sent&amp;quot; : 10}])&lt;br /&gt;
&amp;gt; db.test_where.find({&amp;quot;$where&amp;quot; : function() {&lt;br /&gt;
... for (var current in this) {&lt;br /&gt;
...   for (var other in this) {&lt;br /&gt;
...     if (current != other &amp;amp;&amp;amp; this[current] == this[other]) {&lt;br /&gt;
...       return true;&lt;br /&gt;
...     }&lt;br /&gt;
...   }&lt;br /&gt;
... }&lt;br /&gt;
... return false;&lt;br /&gt;
... }});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cursors ⌘===&lt;br /&gt;
* MongoDB returns results from find using a cursor&lt;br /&gt;
* the lifetime of the cursor, immortal cursor&lt;br /&gt;
* creating cursors in shell: &amp;#039;&amp;#039;&amp;#039;var res = db.test.find()&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* use &amp;#039;&amp;#039;&amp;#039;next&amp;#039;&amp;#039;&amp;#039; to iterate through results&lt;br /&gt;
* use &amp;#039;&amp;#039;&amp;#039;hasNext&amp;#039;&amp;#039;&amp;#039; to check if there is another document&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; var cursor = db.people.find()&lt;br /&gt;
&amp;gt; while (cursor.hasNext()) { &lt;br /&gt;
...   doc = cursor.next();&lt;br /&gt;
...   print(doc.Name+&amp;quot; was born in &amp;quot;+doc.BirthYear);&lt;br /&gt;
... }&lt;br /&gt;
Johnny Depp was born in 1963&lt;br /&gt;
Sean Connery was born in 1930&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* there is &amp;#039;&amp;#039;&amp;#039;forEach&amp;#039;&amp;#039;&amp;#039; as an alternative for &amp;#039;&amp;#039;&amp;#039;while&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; var cursor = db.people.find()&lt;br /&gt;
&amp;gt; cursor.forEach(function(doc) {&lt;br /&gt;
...   print(doc.Name+&amp;quot; was born in &amp;quot;+doc.BirthYear);&lt;br /&gt;
... })&lt;br /&gt;
Johnny Depp was born in 1963&lt;br /&gt;
Sean Connery was born in 1930&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Query Options ⌘===&lt;br /&gt;
* .limit(), .skip(), .sort()&lt;br /&gt;
* pagination and avoiding large skips&lt;br /&gt;
* $maxScan, $showDiskLoc, $min, $max&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;.snapshot()&amp;#039;&amp;#039;&amp;#039; for consistent results in large collections&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.people.find().limit(3).skip(5).sort({&amp;quot;BirthYear&amp;quot; : -1})&lt;br /&gt;
&amp;gt; db.people.find({}, {&amp;quot;Nationality&amp;quot; : 1, &amp;quot;Name&amp;quot; : 1}).sort({&amp;quot;Nationality&amp;quot; : -1, &amp;quot;Name&amp;quot; : 1})&lt;br /&gt;
&amp;gt; db.people.find()._addSpecial(&amp;quot;$maxScan&amp;quot;, 5)&lt;br /&gt;
&amp;gt; db.people.find()._addSpecial(&amp;quot;$showDiskLoc&amp;quot;, true)&lt;br /&gt;
&amp;gt; db.people.find().min({&amp;quot;BirthYear&amp;quot; : 1975}).max({&amp;quot;BirthYear&amp;quot; : 1990})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Data Manipulation ⌘==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Insert ⌘===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;insert&amp;#039;&amp;#039;&amp;#039; is the basic method to add documents&lt;br /&gt;
* _id will be created automatically if not present in document&lt;br /&gt;
* batch insert (pass an array of documents, max 48MB at once, faster)&lt;br /&gt;
* insert validation&lt;br /&gt;
** only basic structure, size (16MB), adds _id&lt;br /&gt;
** most drivers do additional tests (size, non-UTF-8 strings, unrecognised data types) before sending data to MongoDB&lt;br /&gt;
** use Object.bsonsize(doc) to see the BSON size of doc in bytes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.people.insert({&amp;quot;_id&amp;quot; : 123, &amp;quot;Name&amp;quot; : &amp;quot;Al Pacino&amp;quot;})&lt;br /&gt;
&amp;gt; db.people.insert({&amp;quot;Name&amp;quot; : &amp;quot;Sean Connery&amp;quot;})&lt;br /&gt;
&amp;gt; db.people.insert([{&amp;quot;Name&amp;quot; : &amp;quot;Meryl Streep&amp;quot;}, {&amp;quot;Name&amp;quot; : &amp;quot;Clint Eastwood&amp;quot;}, {&amp;quot;Name&amp;quot; : &amp;quot;Penélope Cruz&amp;quot;}])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Remove ⌘===&lt;br /&gt;
* remove expects a query document as a parameter&lt;br /&gt;
* if query document is empty it will delete all documents from the collection but not entire collection&lt;br /&gt;
* there is no way to recover removed documents&lt;br /&gt;
* drop is a very fast alternative when removing all documents (require to recreate all indexes)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.people.stats()&lt;br /&gt;
&amp;gt; db.people.remove({&amp;quot;Nationality&amp;quot; : &amp;quot;Great Britain&amp;quot;})&lt;br /&gt;
&amp;gt; db.people.remove({})&lt;br /&gt;
&amp;gt; db.people.drop()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Update ⌘===&lt;br /&gt;
* update expects two parameters:&lt;br /&gt;
** a query document to locate documents to be updated&lt;br /&gt;
** a new document or document that describes how found documents will be changed&lt;br /&gt;
* conflicting updates - the last update will &amp;quot;win&amp;quot;&lt;br /&gt;
* using _id for update criteria will be faster and safer than other fields&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; person = db.people.findOne({&amp;quot;Name&amp;quot; : &amp;quot;Sean Connery&amp;quot;})&lt;br /&gt;
&amp;gt; person.Occupation = &amp;quot;Actor&amp;quot;&lt;br /&gt;
&amp;gt; db.people.update({&amp;quot;Name&amp;quot; : &amp;quot;Sean Connery&amp;quot;}, person)&lt;br /&gt;
&amp;gt; db.people.findOne({&amp;quot;Name&amp;quot; : &amp;quot;Sean Connery&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Update Modifiers ⌘===&lt;br /&gt;
* useful when changing only specified fields of a document&lt;br /&gt;
* used for complex update operations (altering, adding, removing keys, manipulating arrays or embedded documents)&lt;br /&gt;
* if key does not exist it will be created&lt;br /&gt;
* _id field cannot be changed&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;$inc&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;$set&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;$unset&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;$push&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;$pull&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;$each&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;$slice&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;$sort&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;$pop&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;$ne&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;$addToSet&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;$&amp;#039;&amp;#039;&amp;#039; (positional array modificator)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.people.findOne({&amp;quot;Name&amp;quot; : &amp;quot;Sean Connery&amp;quot;})&lt;br /&gt;
&amp;gt; db.people.update({&amp;quot;Name&amp;quot; : &amp;quot;Sean Connery&amp;quot;}, {&amp;quot;$inc&amp;quot; : {&amp;quot;Age&amp;quot; : 1}})&lt;br /&gt;
&amp;gt; db.people.findOne({&amp;quot;Name&amp;quot; : &amp;quot;Sean Connery&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Upsert ⌘===&lt;br /&gt;
* upsert is a special type of update&lt;br /&gt;
* advantage: the same code for create and update&lt;br /&gt;
* it will create a document if there is no document that matches the update criteria&lt;br /&gt;
* new document will combine update data and criteria&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;$setOnInsert&amp;#039;&amp;#039;&amp;#039; modifier&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;.save()&amp;#039;&amp;#039;&amp;#039; shell helper&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.websites.update({&amp;quot;url&amp;quot; : &amp;quot;nobleprog.pl&amp;quot;}, {&amp;quot;$inc&amp;quot; : {&amp;quot;pageviews&amp;quot; : 1}})&lt;br /&gt;
&amp;gt; db.websites.update({&amp;quot;url&amp;quot; : &amp;quot;nobleprog.pl&amp;quot;}, {&amp;quot;$inc&amp;quot; : {&amp;quot;pageviews&amp;quot; : 1}}, true)&lt;br /&gt;
&amp;gt; db.websites.update({&amp;quot;url&amp;quot; : &amp;quot;nobleprog.pl&amp;quot;}, {&amp;quot;$inc&amp;quot; : {&amp;quot;pageviews&amp;quot; : 1}}, {upsert : true})&lt;br /&gt;
&amp;gt; db.websites.update({&amp;quot;url&amp;quot; : &amp;quot;nobleprog.pl&amp;quot;}, {&amp;quot;$inc&amp;quot; : {&amp;quot;pageviews&amp;quot; : 1}, &amp;quot;$setOnInsert&amp;quot; : {&amp;quot;instertDate&amp;quot; : new Date()}}, {upsert : true})&lt;br /&gt;
&amp;gt; db.websites.find().pretty()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Updating Multiple Documents ⌘===&lt;br /&gt;
* by default only first document will be changed&lt;br /&gt;
* default behaviour may change in the future&lt;br /&gt;
* db.runCommand({getLastError : 1})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.people.insert([{&amp;quot;Name&amp;quot; : &amp;quot;Jack Nicholson&amp;quot;, &amp;quot;Nationality&amp;quot; : &amp;quot;USA&amp;quot;}, {&amp;quot;Name&amp;quot; : &amp;quot;Bruce Willis&amp;quot;, &amp;quot;Nationality&amp;quot; : &amp;quot;RFN&amp;quot;}, {&amp;quot;Name&amp;quot; : &amp;quot;Morgan Freeman&amp;quot;, &amp;quot;Nationality&amp;quot; : &amp;quot;USA&amp;quot;}])&lt;br /&gt;
&amp;gt; db.people.update({&amp;quot;Nationality&amp;quot; : &amp;quot;USA&amp;quot;}, {&amp;quot;$set&amp;quot; : {&amp;quot;Nationality&amp;quot; : &amp;quot;United States of America&amp;quot;}})&lt;br /&gt;
&amp;gt; db.people.update({&amp;quot;Nationality&amp;quot; : &amp;quot;USA&amp;quot;}, {&amp;quot;$set&amp;quot; : {&amp;quot;Nationality&amp;quot; : &amp;quot;United States of America&amp;quot;}}, false, true)&lt;br /&gt;
&amp;gt; db.people.update({&amp;quot;Nationality&amp;quot; : &amp;quot;USA&amp;quot;}, {&amp;quot;$set&amp;quot; : {&amp;quot;Nationality&amp;quot; : &amp;quot;United States of America&amp;quot;}}, {multi : true})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Two Phase Commits ⌘===&lt;br /&gt;
* http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Indexes in MongoDB}}&lt;br /&gt;
&lt;br /&gt;
== Aggregation ⌘==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Single Purpose Aggregation ⌘===&lt;br /&gt;
* count, distinct, group&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.people.count()&lt;br /&gt;
&amp;gt; db.people.count({&amp;quot;Occupation&amp;quot; : &amp;quot;Producer&amp;quot;})&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; db.people.distinct(&amp;quot;Movie.Title&amp;quot;)&lt;br /&gt;
&amp;gt; db.runCommand({&amp;quot;distinct&amp;quot; : &amp;quot;people&amp;quot;, &amp;quot;key&amp;quot; : &amp;quot;Movie.Title&amp;quot;})&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; db.people.group({&lt;br /&gt;
...   &amp;quot;key&amp;quot; : {&amp;quot;Nationality&amp;quot; : 1},&lt;br /&gt;
...   //&amp;quot;$keyf&amp;quot; : function(curr) { return {&amp;quot;Nationality&amp;quot; : curr.Nationality.toLowerCase()}; },&lt;br /&gt;
...   &amp;quot;initial&amp;quot; : {&amp;quot;BirthYear&amp;quot; : 0},&lt;br /&gt;
...   &amp;quot;reduce&amp;quot; : function(curr, result) {&lt;br /&gt;
...     if (curr.BirthYear &amp;gt; result.BirthYear) {&lt;br /&gt;
...       result.BirthYear = curr.BirthYear;&lt;br /&gt;
...       result.Nationality = curr.Nationality;&lt;br /&gt;
...     }&lt;br /&gt;
...   },&lt;br /&gt;
...   &amp;quot;condition&amp;quot; : {&amp;quot;Nationality&amp;quot; : {&amp;quot;$ne&amp;quot; : null}},&lt;br /&gt;
...   &amp;quot;finalize&amp;quot; : function(result) {&lt;br /&gt;
...     result[result.Nationality] = result.BirthYear;&lt;br /&gt;
...     delete result.Nationality;&lt;br /&gt;
...     delete result.BirthYear;&lt;br /&gt;
...   }&lt;br /&gt;
... })&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aggregation Pipelines ⌘===&lt;br /&gt;
* aggregation is a pipeline&lt;br /&gt;
* some pipeline operators: $match, $project, $group, $sort, $limit, $skip, $unwind, $lookup, $out&lt;br /&gt;
* $group and $sort needs to collect all documents&lt;br /&gt;
* results were limited to 16MB, now unlimited&lt;br /&gt;
* memory usage limited to 100MB, allowDiskUse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.people.aggregate([{&amp;quot;$project&amp;quot; : {&amp;quot;Nationality&amp;quot; : 1}},&lt;br /&gt;
...   {&amp;quot;$group&amp;quot; : {&amp;quot;_id&amp;quot; : &amp;quot;$Nationality&amp;quot;, &amp;quot;count&amp;quot; : {&amp;quot;$sum&amp;quot; : 1}}},&lt;br /&gt;
...   {&amp;quot;$sort&amp;quot; : {&amp;quot;count&amp;quot; : -1}},&lt;br /&gt;
...   {&amp;quot;$limit&amp;quot; : 3}&lt;br /&gt;
... ])&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; db.people.aggregate([{&amp;quot;$project&amp;quot; : {&amp;quot;Country&amp;quot; : &amp;quot;$Nationality&amp;quot;}}])&lt;br /&gt;
&amp;gt; db.people.aggregate([{&amp;quot;$project&amp;quot; : {&amp;quot;Movie&amp;quot; : 1, &amp;quot;_id&amp;quot; :  0}}, {&amp;quot;$unwind&amp;quot; : &amp;quot;$Movie&amp;quot;}])&lt;br /&gt;
&amp;gt; db.people.aggregate([{&amp;quot;$project&amp;quot; : {&amp;quot;Movie&amp;quot; : 1, &amp;quot;_id&amp;quot; :  0}}, {&amp;quot;$unwind&amp;quot; : &amp;quot;$Movie&amp;quot;}, {$out:&amp;quot;aggregated&amp;quot;}])&lt;br /&gt;
&amp;gt; db.people.aggregate([...], {{allowDiskUse: true, explain: true}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== $project Expressions ⌘====&lt;br /&gt;
* mathematical: $add, $subtract, $multiply, $divide, $mod&lt;br /&gt;
* date: $year, $month, $week, $dayOfMonth, $dayOfWeek, $dayOfYear, $hour, $minute, $second&lt;br /&gt;
* string: $substr, $concat, $toLower, $toUpper&lt;br /&gt;
* comparison: $cmp, $strcasecmd, $eq, $ne, $gt, $gte, $lt, $lte&lt;br /&gt;
* logical: $and, $or, $not, $cond, $ifNull&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.people.aggregate([{&amp;quot;$match&amp;quot; : {&amp;quot;BirthDate&amp;quot; : {&amp;quot;$gte&amp;quot; : new Date(&amp;quot;1970-01-01&amp;quot;)}}}, {&amp;quot;$project&amp;quot; : {&amp;quot;BirthDate&amp;quot; : {&amp;quot;$year&amp;quot; : &amp;quot;$BirthDate&amp;quot;}}}])&lt;br /&gt;
&amp;gt; db.people.aggregate([{&amp;quot;$project&amp;quot; : {&amp;quot;Nationality&amp;quot; : {&amp;quot;$ifNull&amp;quot; : [&amp;quot;$Nationality&amp;quot;, &amp;quot;unknown&amp;quot;]}}}])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== $group Expressions ⌘====&lt;br /&gt;
* arithmetical: $sum, $avg, &lt;br /&gt;
* extreme: $min, $max, $first, $last&lt;br /&gt;
* array: $addToSet, $push&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.people.aggregate([{$group:{_id:&amp;quot;$Nationality&amp;quot;, peopleCount:{$sum:1}}}])&lt;br /&gt;
&amp;gt; db.people.aggregate([{$group:{_id:&amp;quot;$BirthYear&amp;quot;, people:{$addToSet:&amp;quot;$Name&amp;quot;}}}])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Views ====&lt;br /&gt;
* new in version 3.4&lt;br /&gt;
* views are always read-only&lt;br /&gt;
* views are based on existing collections or other views&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; db.createView(&amp;lt;view&amp;gt;, &amp;lt;source&amp;gt;, &amp;lt;pipeline&amp;gt;, &amp;lt;collation&amp;gt;)&lt;br /&gt;
&amp;gt; db.createView(&amp;quot;peopleByBirthYear&amp;quot;, &amp;quot;people&amp;quot;, [{$group:{_id:&amp;quot;$BirthYear&amp;quot;, people:{$addToSet:&amp;quot;$Name&amp;quot;}}}])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Map-Reduce ⌘===&lt;br /&gt;
* powerful and flexible tool for aggregation&lt;br /&gt;
* MR uses JavaScript as a &amp;quot;query language&amp;quot;&lt;br /&gt;
* not very fast&lt;br /&gt;
* arguments: mapreduce, map, reduce, finalize, keeptemp, out, query, sort, limit, scope, verbose&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt; map = function () {&lt;br /&gt;
... for (var key in this) {&lt;br /&gt;
...   emit(key, {count : 1});&lt;br /&gt;
... }}&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; reduce = function (key, emits) {&lt;br /&gt;
...   total = 0;&lt;br /&gt;
...   for (var i in emits) {&lt;br /&gt;
...     total += emits[i].count;&lt;br /&gt;
...   }&lt;br /&gt;
...   return {&amp;quot;count&amp;quot; : total};&lt;br /&gt;
... }&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; db.runCommand({&amp;quot;mapreduce&amp;quot; : &amp;quot;people&amp;quot;, &amp;quot;map&amp;quot; : map, &amp;quot;reduce&amp;quot; : reduce, &amp;quot;out&amp;quot; : &amp;quot;mapreduce_output_collection&amp;quot;})&lt;br /&gt;
&amp;gt; db.mapreduce_output_collection.find()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Data models ⌘==&lt;br /&gt;
* normalization vs. denormalization (referencing vs. embedding)&lt;br /&gt;
* few things to consider:&lt;br /&gt;
** writes vs. reads&lt;br /&gt;
** immediate consistency vs. eventual consistency&lt;br /&gt;
** one-to-many vs. one-to-few&lt;br /&gt;
** document growth&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Embedding is better for... !! References are better for&lt;br /&gt;
|-&lt;br /&gt;
| small subdocuments || large subdocuments&lt;br /&gt;
|-&lt;br /&gt;
| data that does not change regularly || volatile data&lt;br /&gt;
|-&lt;br /&gt;
| when eventual consistency is acceptable || when immediate consistency is necessary&lt;br /&gt;
|-&lt;br /&gt;
| documents that grow by a small amount || documents that grow by a large amount&lt;br /&gt;
|-&lt;br /&gt;
| data that you&amp;#039;ll often need to perform a second query to fetch || data that you&amp;#039;ll often exclude from results&lt;br /&gt;
|-&lt;br /&gt;
| fast reads || fast writes&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* more resources: &lt;br /&gt;
** docs.mongodb.com/manual/core/data-modeling-introduction/&lt;br /&gt;
** developer.mongodb.com/article/mongodb-schema-design-best-practices/&lt;/div&gt;</summary>
		<author><name>Kbaran</name></author>
	</entry>
</feed>