/
indexing.html
157 lines (154 loc) · 9.89 KB
/
indexing.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=utf-8' http-equiv='Content-Type' />
<meta content='A Ruby ODM for MongoDB' name='description' />
<meta content='mongoid, mongodb, ruby, rails, odm, durran jordan' name='keywords' />
<!--[if lt IE 9]>
<script src='http://html5shiv.googlecode.com/svn/trunk/html5.js'></script>
<![endif]-->
<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0' name='viewport' />
<link href="/stylesheets/bootstrap.min.css" media="screen" rel="stylesheet" type="text/css" />
<link href="/stylesheets/bootstrap-responsive.min.css" media="screen" rel="stylesheet" type="text/css" />
<link href="/stylesheets/mongoid.css" media="screen" rel="stylesheet" type="text/css" />
<link href="/stylesheets/mongoid-coderay.css" media="screen" rel="stylesheet" type="text/css" />
<script src="/javascripts/jquery-1.8.1.min.js" type="text/javascript"></script>
<script src="/javascripts/bootstrap-dropdown.js" type="text/javascript"></script>
<script src="/javascripts/bootstrap-scrollspy.js" type="text/javascript"></script>
<script src="/javascripts/bootstrap-tooltip.js" type="text/javascript"></script>
<script src="/javascripts/mongoid.js" type="text/javascript"></script>
<title>Mongoid: Indexing</title>
</head>
<body data-offset='100' data-spy='scroll-spy' data-target='.page-nav'>
<div class='mongoid' id='header'>
<div class='navbar navbar-inverse navbar-fixed-top'>
<div class='navbar-inner'>
<div class='container'>
<ul class='nav'>
<li class='link'>
<a title="Mongoid" href="/en/mongoid/"><img src="/images/mongoid-logo-small-green.png" />
</a>
</li>
<li class='link'>
<a title="Origin" href="/en/origin/"><img src="/images/origin-logo-small-white.png" />
</a>
</li>
<li class='link'>
<a title="Moped" href="/en/moped/"><img src="/images/moped-logo-small-white.png" />
</a>
</li>
</ul>
<div class='logo-text'>
mongoid
</div>
</div>
</div>
</div>
</div>
<div id='navigation'>
<div class='subnav'>
<div class='container'>
<ul class='nav nav-pills mongoid'>
<li><a href="/en/mongoid/">HOME</a></li>
<li class='dropdown' id='docs'>
<a class='dropdown-toggle' data-toggle='dropdown' href='#docs'>
DOCS
<b class='caret'></b>
</a>
<ul class='dropdown-menu'>
<li><a href="/en/mongoid/docs/installation.html">Installation</a></li>
<li><a href="/en/mongoid/docs/documents.html">Documents</a></li>
<li><a href="/en/mongoid/docs/persistence.html">Persistence</a></li>
<li><a href="/en/mongoid/docs/querying.html">Querying</a></li>
<li><a href="/en/mongoid/docs/relations.html">Relations</a></li>
<li><a href="/en/mongoid/docs/nested_attributes.html">Nested Attributes</a></li>
<li><a href="/en/mongoid/docs/identity_map.html">Identity Map</a></li>
<li><a href="/en/mongoid/docs/callbacks.html">Callbacks</a></li>
<li><a href="/en/mongoid/docs/validation.html">Validation</a></li>
<li><a href="/en/mongoid/docs/indexing.html">Indexing</a></li>
<li><a href="/en/mongoid/docs/rails.html">Rails</a></li>
<li><a href="/en/mongoid/docs/extras.html">Extras</a></li>
<li><a href="/en/mongoid/docs/upgrading.html">Upgrading</a></li>
<li><a href="/en/mongoid/docs/contributing.html">Contributing</a></li>
<li><a href="/en/mongoid/docs/performance.html">Performance</a></li>
<li><a href="/en/mongoid/docs/tips.html">Tips/FAQs</a></li>
</ul>
</li>
<li><a href="/en/mongoid/links.html">LINKS</a></li>
<li><a href="/en/mongoid/donate.html">DONATE</a></li>
</ul>
</div>
</div>
</div>
<div id='content'>
<div class='container'>
<h1>Indexing</h1>
<p>
You can define indexes on documents using the index macro. Provide the key
for the index along with a direction. For additional options, supply them
in a second options hash paramter.
</p>
<div class="CodeRay">
<div class="code"><pre><span class="keyword">class</span> <span class="class">Person</span>
 include <span class="constant">Mongoid</span>::<span class="constant">Document</span>
 field <span class="symbol">:ssn</span>

 index({ ssn: <span class="integer">1</span> }, { unique: <span class="predefined-constant">true</span>, name: <span class="string"><span class="delimiter">"</span><span class="content">ssn_index</span><span class="delimiter">"</span></span> })
<span class="keyword">end</span>
</pre></div>
</div>
<p>
You can define indexes on embedded document fields as well.
</p>
<div class="CodeRay">
<div class="code"><pre><span class="keyword">class</span> <span class="class">Person</span>
 include <span class="constant">Mongoid</span>::<span class="constant">Document</span>
 embeds_many <span class="symbol">:addresses</span>
 index <span class="string"><span class="delimiter">"</span><span class="content">addresses.street</span><span class="delimiter">"</span></span> => <span class="integer">1</span>
<span class="keyword">end</span>
</pre></div>
</div>
<p>
You can index on multiple fields and provide direction.
</p>
<div class="CodeRay">
<div class="code"><pre><span class="keyword">class</span> <span class="class">Person</span>
 include <span class="constant">Mongoid</span>::<span class="constant">Document</span>
 field <span class="symbol">:first_name</span>
 field <span class="symbol">:last_name</span>

 index({ first_name: <span class="integer">1</span>, last_name: <span class="integer">1</span> }, { unique: <span class="predefined-constant">true</span> })
<span class="keyword">end</span>
</pre></div>
</div>
<p>
Indexes can be sparse:
<div class="CodeRay">
<div class="code"><pre><span class="keyword">class</span> <span class="class">Person</span>
 include <span class="constant">Mongoid</span>::<span class="constant">Document</span>
 field <span class="symbol">:ssn</span>

 index({ ssn: <span class="integer">-1</span> }, { sparse: <span class="predefined-constant">true</span> })
<span class="keyword">end</span>
</pre></div>
</div>
</p>
<p>
Indexes can be run in the background in cases where they may take some time:
</p>
<div class="CodeRay">
<div class="code"><pre><span class="keyword">class</span> <span class="class">Person</span>
 include <span class="constant">Mongoid</span>::<span class="constant">Document</span>
 field <span class="symbol">:ssn</span>
 index({ ssn: <span class="integer">1</span> }, { unique: <span class="predefined-constant">true</span>, background: <span class="predefined-constant">true</span> })
<span class="keyword">end</span>
</pre></div>
</div>
<p>
For geospacial indexes, make sure the field you are indexing is an <tt>Array</tt>.
</p>
<div class="CodeRay">
<div class="code"><pre><span class="keyword">class</span> <span class="class">Person</span>
 include <span class="constant">Mongoid</span>::<span class="constant">Document</span>
 field <span class="symbol">:location</span>, type: <span class="constant">Array</span>

 index({ location: <span class="string"><span class="delimiter">"</span><span class="content">2d</span><span class="delimiter">"</span></span> }, { min: <span class="integer">-200</span>, max: <span class="integer">200</span> })
<span class="keyword">end</span>
</pre></div>
</div>
<p>
Indexes can be scoped to a specific database.
</p>
<div class="CodeRay">
<div class="code"><pre><span class="keyword">class</span> <span class="class">Person</span>
 include <span class="constant">Mongoid</span>::<span class="constant">Document</span>
 field <span class="symbol">:ssn</span>
 index({ ssn: <span class="integer">1</span> }, { database: <span class="string"><span class="delimiter">"</span><span class="content">users</span><span class="delimiter">"</span></span>, unique: <span class="predefined-constant">true</span>, background: <span class="predefined-constant">true</span> })
<span class="keyword">end</span>
</pre></div>
</div>
<p>
You can have Mongoid define indexes for you on "foreign key" fields for
relational associations. This only works on the relation macro that the
foreign key is stored on.
</p>
<div class="CodeRay">
<div class="code"><pre><span class="keyword">class</span> <span class="class">Comment</span>
 include <span class="constant">Mongoid</span>::<span class="constant">Document</span>
 belongs_to <span class="symbol">:post</span>, index: <span class="predefined-constant">true</span>
 has_and_belongs_to_many <span class="symbol">:preferences</span>, index: <span class="predefined-constant">true</span>
<span class="keyword">end</span>
</pre></div>
</div>
<p>
When you want to create the indexes in the database, use the provided rake task.
</p>
<div class="CodeRay">
<div class="code"><pre>rake db<span class="symbol">:mongoid</span><span class="symbol">:create_indexes</span>
</pre></div>
</div>
<p>
Mongoid also provides a rake task to delete all secondary indexes, plus non-defined
indexes as well.
</p>
<div class="CodeRay">
<div class="code"><pre>rake db<span class="symbol">:mongoid</span><span class="symbol">:remove_indexes</span></pre></div>
</div>
</div>
</div>
</body>
</html>