<?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=Indexes_in_MongoDB</id>
	<title>Indexes in MongoDB - 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=Indexes_in_MongoDB"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Indexes_in_MongoDB&amp;action=history"/>
	<updated>2026-06-02T21:25:48Z</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=Indexes_in_MongoDB&amp;diff=69852&amp;oldid=prev</id>
		<title>Kbaran: /* Collections Without _id */</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Indexes_in_MongoDB&amp;diff=69852&amp;oldid=prev"/>
		<updated>2018-10-19T10:26:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Collections Without _id&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;
== Indexes and Query Optimization ==&lt;br /&gt;
* database index works like index in a book&lt;br /&gt;
* indexes in MongoDB works almost identical to relational databases&lt;br /&gt;
* because of indexes reads are faster but writes slower&lt;br /&gt;
* 64 indexes per collection&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Collection Without Indexes ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
for (var i=1; i&amp;lt;=1000000; i++) {&lt;br /&gt;
  db.visitors.insert({&lt;br /&gt;
    &amp;quot;i&amp;quot; : i,&lt;br /&gt;
    &amp;quot;visitor&amp;quot; : &amp;quot;visitor_&amp;quot;+i,&lt;br /&gt;
    &amp;quot;score&amp;quot; : Math.floor(Math.random()*10+1),&lt;br /&gt;
    &amp;quot;date&amp;quot; : new Date()&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;
=== One Field Indexes ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
db.visitors.explain().find({&amp;quot;visitor&amp;quot; : &amp;quot;visitor_330&amp;quot;})&lt;br /&gt;
db.visitors.explain().find({&amp;quot;visitor&amp;quot; : &amp;quot;visitor_330&amp;quot;}).limit(1)&lt;br /&gt;
db.visitors.explain().find({&amp;quot;visitor&amp;quot; : &amp;quot;visitor_99999&amp;quot;}).limit(1)&lt;br /&gt;
db.visitors.createIndex({&amp;quot;visitor&amp;quot; : 1})&lt;br /&gt;
db.visitors.explain().find({&amp;quot;visitor&amp;quot; : &amp;quot;visitor_99999&amp;quot;})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compound Indexes ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
db.visitors.find().sort({&amp;quot;score&amp;quot; : 1, &amp;quot;visitor&amp;quot; : 1})&lt;br /&gt;
db.visitors.createIndex({&amp;quot;visitor&amp;quot; : 1})&lt;br /&gt;
db.visitors.createIndex({&amp;quot;score&amp;quot; : 1, &amp;quot;visitor&amp;quot; : 1})&lt;br /&gt;
db.visitors.explain(true).find({&amp;quot;score&amp;quot; : 10}).sort({&amp;quot;visitor&amp;quot; : -1})&lt;br /&gt;
db.visitors.explain(true).find({&amp;quot;score&amp;quot; : {&amp;quot;$gte&amp;quot; : 10, &amp;quot;$lte&amp;quot; : 20}})&lt;br /&gt;
db.visitors.explain(true).find({&amp;quot;score&amp;quot; : {&amp;quot;$gte&amp;quot; : 10, &amp;quot;$lte&amp;quot; : 20}}).sort({&amp;quot;visitor&amp;quot; : 1})&lt;br /&gt;
db.visitors.createIndex({&amp;quot;visitor&amp;quot; : 1, &amp;quot;score&amp;quot; : 1})&lt;br /&gt;
db.visitors.explain(true).find({&amp;quot;score&amp;quot; : {&amp;quot;$gte&amp;quot; : 10, &amp;quot;$lte&amp;quot; : 20}}).sort({&amp;quot;visitor&amp;quot; : 1}).hint({&amp;quot;visitor&amp;quot; : 1, &amp;quot;score&amp;quot; : 1})&lt;br /&gt;
db.visitors.dropIndex(&amp;quot;visitor_1&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compound Indexes (2) ===&lt;br /&gt;
* pattern {SortKey : 1, CriteriaKey : 1}&lt;br /&gt;
* pattern {ExactMatch : 1, RangeCriteria : 1}&lt;br /&gt;
* sorting directions {&amp;quot;score&amp;quot; : -1, &amp;quot;visitor&amp;quot; : 1}&lt;br /&gt;
* {&amp;quot;score&amp;quot; : -1, &amp;quot;visitor&amp;quot; : 1} = {&amp;quot;score&amp;quot; : 1, &amp;quot;visitor&amp;quot; : -1}&lt;br /&gt;
* covered indexes (indexOnly : true or totalDocsExamined = 0 when totalKeysExamined &amp;gt; 0)&lt;br /&gt;
* {key1 : 1, key2 : 1, key3 : 1} eliminates the need of creating {key1 : 1} and {key1 : 1, key2 : 1}&lt;br /&gt;
* $-operators and indexes ($where, $exists, $nin, $ne, $not)&lt;br /&gt;
* queries with $or can use more than one index&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Indexing Arrays and SubDocuments ===&lt;br /&gt;
* usually it behaves like normal index&lt;br /&gt;
* difference between indexing {&amp;quot;BirthPlace&amp;quot; : 1} and {&amp;quot;BirthPlace.Country&amp;quot; : 1}&lt;br /&gt;
* only one array field per index&lt;br /&gt;
* multikey indexes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
db.people.createIndex({&amp;quot;Movie.Title&amp;quot; : 1})&lt;br /&gt;
db.people.createIndex({&amp;quot;BirthPlace.Country&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;
=== Indexes in Details ===&lt;br /&gt;
* low and high cardinality fields&lt;br /&gt;
* understanding .explain()&lt;br /&gt;
* using .hint()&lt;br /&gt;
* query optimizer (100 results, 1000 queries, index creation)&lt;br /&gt;
* fields in index must be smaller than 1kB&lt;br /&gt;
* options: unique, dropDups, sparse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
db.visitors.createIndex({&amp;quot;visitor&amp;quot; : 1}, {&amp;quot;unique&amp;quot; : 1, &amp;quot;dropDups&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;
=== Sparse Index ===&lt;br /&gt;
* only contain entries for documents that have the indexed field (even if the index field contains a null value)&lt;br /&gt;
* useful with unique constraint&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
db.sparse_index.insert([{y:1, x:1}, {y:1, x:2}, {y:1, x:3}, {y:1}])&lt;br /&gt;
db.sparse_index.createIndex({x:1}, {unique:1})&lt;br /&gt;
db.sparse_index.insert({y:1})&lt;br /&gt;
&lt;br /&gt;
db.sparse_index.dropIndexes()&lt;br /&gt;
db.sparse_index.createIndex({x:1}, {unique:1, sparse:1})&lt;br /&gt;
db.sparse_index.insert({y:1})&lt;br /&gt;
&lt;br /&gt;
db.sparse_index.find({&amp;quot;x&amp;quot; : {&amp;quot;$ne&amp;quot; : 2}}).hint({&amp;quot;x&amp;quot; : 1})&lt;br /&gt;
db.sparse_index.find({&amp;quot;x&amp;quot; : {&amp;quot;$ne&amp;quot; : 2}}).hint({&amp;quot;$natural&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;
=== Index Administration ===&lt;br /&gt;
* system.indexes - read only collection that stores info about indexes&lt;br /&gt;
* .createIndex()&lt;br /&gt;
* .dropIndex(), .dropIndexes()&lt;br /&gt;
* .getIndexes()&lt;br /&gt;
* options: background, name&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Capped Collections ===&lt;br /&gt;
* it has to be created before first insert occurs&lt;br /&gt;
* fixed size or size and number of documents (circular queue)&lt;br /&gt;
* forbidden operations on documents: removing, updating (if it will increase the size)&lt;br /&gt;
* can not be sharded or changed&lt;br /&gt;
* sorting: $natural : 1 (or -1)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
db.createCollection(&amp;quot;capped_collection&amp;quot;, {&amp;quot;capped&amp;quot; : true, &amp;quot;size&amp;quot; : 100000})&lt;br /&gt;
db.createCollection(&amp;quot;capped_collection&amp;quot;, {&amp;quot;capped&amp;quot; : true, &amp;quot;size&amp;quot; : 100000, &amp;quot;max&amp;quot; : 20})&lt;br /&gt;
&lt;br /&gt;
db.people.copyTo(&amp;quot;capped_collection&amp;quot;)&lt;br /&gt;
db.runCommand({&amp;quot;convertToCapped&amp;quot; : &amp;quot;capped_collection&amp;quot;, &amp;quot;size&amp;quot; : 100000})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Tailable Cursors ====&lt;br /&gt;
* inspired by the tail -f command&lt;br /&gt;
* not closed when their results are exhausted&lt;br /&gt;
* can be used only on capped collection&lt;br /&gt;
* will die after 10 minutes&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TTL Indexes (time-to-live) ===&lt;br /&gt;
* TTL index allows you to set a timeout for each document&lt;br /&gt;
* removing is performed every 60 secons&lt;br /&gt;
* can be created only on single field (date field)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
db.ttl_collection.insert({&amp;quot;User&amp;quot; : &amp;quot;user1&amp;quot;, &amp;quot;LastUpdated&amp;quot; : new Date()})&lt;br /&gt;
db.ttl_collection.createIndex({&amp;quot;LastUpdated&amp;quot; : 1}, {&amp;quot;expireAfterSeconds&amp;quot; : 30})&lt;br /&gt;
db.ttl_collection.find()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Full-Text Indexes ===&lt;br /&gt;
* quick text search with built-in multi-language support&lt;br /&gt;
* very expensive, especially on busy collections&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
db.people.createIndex({&amp;quot;Name&amp;quot; : &amp;quot;text&amp;quot;})&lt;br /&gt;
db.people.createIndex({&amp;quot;Name&amp;quot; : &amp;quot;text&amp;quot;, &amp;quot;Bio&amp;quot; : &amp;quot;text&amp;quot;}, {&amp;quot;weights&amp;quot; : {&amp;quot;Name&amp;quot;: 2}})&lt;br /&gt;
db.people.createIndex({&amp;quot;$**&amp;quot; : &amp;quot;text&amp;quot;})&lt;br /&gt;
db.people.createIndex({&amp;quot;whatever&amp;quot; : &amp;quot;text&amp;quot;}, {&amp;quot;weights&amp;quot; : {&amp;quot;Name&amp;quot; : 5, &amp;quot;Movie.Name&amp;quot; : 2, &amp;quot;$**&amp;quot; : 1}})&lt;br /&gt;
&lt;br /&gt;
db.runCommand({&amp;quot;text&amp;quot; : &amp;quot;people&amp;quot;, &amp;quot;search&amp;quot; : &amp;quot;emma thompson&amp;quot;})&lt;br /&gt;
db.people.find({$text : {$search : &amp;quot;emma thompson&amp;quot;}})&lt;br /&gt;
db.people.find({$text : {$search : &amp;quot;\&amp;quot;emma thompson\&amp;quot;&amp;quot;}})&lt;br /&gt;
db.people.find({$text : {$search : &amp;quot;-emma thompson&amp;quot;}})&lt;br /&gt;
db.people.find({$text : {$search : &amp;quot;emma thompson&amp;quot;}}, {score : {$meta : &amp;quot;textScore&amp;quot;}})&lt;br /&gt;
db.people.find({$text : {$search : &amp;quot;emma thompson&amp;quot;}}, {score : {$meta : &amp;quot;textScore&amp;quot;}}).sort({ score: { $meta: &amp;quot;textScore&amp;quot; } })&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geospatial Indexes ===&lt;br /&gt;
&lt;br /&gt;
==== 2d index ====&lt;br /&gt;
* for data stored as points on a two-dimensional plane&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
db.dots.insert([{Name:&amp;quot;A&amp;quot;, location:[10, 5]}, {Name:&amp;quot;B&amp;quot;, location:[17, -5]}, {Name:&amp;quot;C&amp;quot;, location:[0, 2]}, {Name:&amp;quot;D&amp;quot;, location:[-3, -3]}])&lt;br /&gt;
db.dots.createIndex({location:&amp;quot;2d&amp;quot;, type:1})&lt;br /&gt;
db.dots.find({location:{$near:[0,0]}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2dsphere index ====&lt;br /&gt;
* supports queries that calculate geometries on an earth-like sphere&lt;br /&gt;
* data stored as GeoJSON objects&lt;br /&gt;
* operators: http://docs.mongodb.org/master/reference/operator/query-geospatial/&lt;br /&gt;
* calculating distance: http://docs.mongodb.org/master/tutorial/calculate-distances-using-spherical-geometry-with-2d-geospatial-indexes/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
db.cities.insert({Name:&amp;quot;Rzeszów&amp;quot;, &amp;quot;location&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;Point&amp;quot;, &amp;quot;coordinates&amp;quot;:[22.008606,50.040264]}})&lt;br /&gt;
db.cities.insert({Name:&amp;quot;Warszawa&amp;quot;, &amp;quot;location&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;Point&amp;quot;, &amp;quot;coordinates&amp;quot;:[21.0123237,52.2328474]}})&lt;br /&gt;
db.cities.insert({Name:&amp;quot;Wrocław&amp;quot;, &amp;quot;location&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;Point&amp;quot;, &amp;quot;coordinates&amp;quot;:[17.0342894,51.1174725]}})&lt;br /&gt;
db.cities.insert({Name:&amp;quot;Kraków&amp;quot;, &amp;quot;location&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;Point&amp;quot;, &amp;quot;coordinates&amp;quot;:[19.9012826,50.0719423]}})&lt;br /&gt;
db.cities.insert({Name:&amp;quot;Kielce&amp;quot;, &amp;quot;location&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;Point&amp;quot;, &amp;quot;coordinates&amp;quot;:[20.6156414,50.85404]}})&lt;br /&gt;
db.cities.createIndex({location:&amp;quot;2dsphere&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
db.cities.find({location:{$near: &lt;br /&gt;
    {$geometry: {type:&amp;quot;Point&amp;quot;, coordinates:[20.6156414, 50.85404]}, $minDistance: 0, $maxDistance:200000}&lt;br /&gt;
}})&lt;br /&gt;
&lt;br /&gt;
db.runCommand({geoNear: &amp;quot;cities&amp;quot;, near: [20.6156414, 50.85404], spherical: true, distanceMultiplier: 6378.1}) // distance in kilometers&lt;br /&gt;
&lt;br /&gt;
db.cities.find({location: {$geoWithin: &lt;br /&gt;
    {$geometry: {type: &amp;quot;Polygon&amp;quot;, coordinates: [[ [22.008606,50.040264], [21.0123237,52.2328474], [19.9012826,50.0719423], [22.008606,50.040264] ]]}}&lt;br /&gt;
}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kbaran</name></author>
	</entry>
</feed>