forked from Automattic/mongoose
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdefaults.html
More file actions
178 lines (152 loc) · 16.8 KB
/
defaults.html
File metadata and controls
178 lines (152 loc) · 16.8 KB
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><title>Mongoose v5.1.8-pre: Defaults</title><link rel="apple-touch-icon" sizes="57x57" href="images/favicon/apple-icon-57x57.png"><link rel="apple-touch-icon" sizes="60x60" href="images/favicon/apple-icon-60x60.png"><link rel="apple-touch-icon" sizes="72x72" href="images/favicon/apple-icon-72x72.png"><link rel="apple-touch-icon" sizes="76x76" href="images/favicon/apple-icon-76x76.png"><link rel="apple-touch-icon" sizes="114x114" href="images/favicon/apple-icon-114x114.png"><link rel="apple-touch-icon" sizes="120x120" href="images/favicon/apple-icon-120x120.png"><link rel="apple-touch-icon" sizes="144x144" href="images/favicon/apple-icon-144x144.png"><link rel="apple-touch-icon" sizes="152x152" href="images/favicon/apple-icon-152x152.png"><link rel="apple-touch-icon" sizes="180x180" href="images/favicon/apple-icon-180x180.png"><link rel="icon" type="image/png" sizes="192x192" href="images/favicon/android-icon-192x192.png"><link rel="icon" type="image/png" sizes="32x32" href="images/favicon/favicon-32x32.png"><link rel="icon" type="image/png" sizes="96x96" href="images/favicon/favicon-96x96.png"><link rel="icon" type="image/png" sizes="16x16" href="images/favicon/favicon-16x16.png"><link rel="stylesheet" href="https://unpkg.com/[email protected]/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous"><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans"><link rel="stylesheet" href="/docs/css/github.css"><link rel="stylesheet" href="/docs/css/mongoose5.css"><link rel="apple-touch-icon" sizes="57x57" href="images/favicon/apple-icon-57x57.png"><link rel="apple-touch-icon" sizes="60x60" href="images/favicon/apple-icon-60x60.png"><link rel="apple-touch-icon" sizes="72x72" href="images/favicon/apple-icon-72x72.png"><link rel="apple-touch-icon" sizes="76x76" href="images/favicon/apple-icon-76x76.png"><link rel="apple-touch-icon" sizes="114x114" href="images/favicon/apple-icon-114x114.png"><link rel="apple-touch-icon" sizes="120x120" href="images/favicon/apple-icon-120x120.png"><link rel="apple-touch-icon" sizes="144x144" href="images/favicon/apple-icon-144x144.png"><link rel="apple-touch-icon" sizes="152x152" href="images/favicon/apple-icon-152x152.png"><link rel="apple-touch-icon" sizes="180x180" href="images/favicon/apple-icon-180x180.png"><link rel="icon" type="image/png" sizes="192x192" href="images/favicon/android-icon-192x192.png"><link rel="icon" type="image/png" sizes="32x32" href="images/favicon/favicon-32x32.png"><link rel="icon" type="image/png" sizes="96x96" href="images/favicon/favicon-96x96.png"><link rel="icon" type="image/png" sizes="16x16" href="images/favicon/favicon-16x16.png"><link rel="manifest" href="images/favicon/manifest.json"><meta name="msapplication-TileColor" content="#ffffff"><meta name="msapplication-TileImage" content="images/favicon/ms-icon-144x144.png"><meta name="theme-color" content="#ffffff"></head><body><div id="layout"><div id="mobile-menu"><a id="menuLink" href="#menu" class="menu-link"><span></span></a><div id="mobile-logo-container"><a href="/"><img id="logo" src="/docs/images/mongoose5_62x30_transparent.png"><span class="logo-text">mongoose</span></a></div></div><div id="menu"><div class="pure-menu"><div id="logo-container" class="pure-menu-heading"><a href="/"><img id="logo" src="/docs/images/mongoose5_62x30_transparent.png"><span class="logo-text">mongoose</span></a></div><ul class="pure-menu-list"><li class="pure-menu-horizontal pure-menu-item pure-menu-has-children pure-menu-allow-hover version"><a href="#" class="pure-menu-link">Version 5.1.8-pre</a><ul class="pure-menu-children"><li class="pure-menu-item"><a href="/docs/4.x" class="pure-menu-link">Version 4.13.14</a></li><li class="pure-menu-item"><a href="/docs/3.8.x" class="pure-menu-link">Version 3.8.40</a></li></ul></li><li class="pure-menu-item"><a href="/docs/index.html" class="pure-menu-link">Quick Start</a></li><li class="pure-menu-item"><a href="/docs/guides.html" class="pure-menu-link">Guides</a></li><li class="pure-menu-item sub-item"><a href="/docs/guide.html" class="pure-menu-link">Schemas</a></li><li class="pure-menu-item sub-item"><a href="/docs/schematypes.html" class="pure-menu-link">SchemaTypes</a></li><li class="pure-menu-item sub-item"><a href="/docs/connections.html" class="pure-menu-link">Connections</a></li><li class="pure-menu-item sub-item"><a href="/docs/models.html" class="pure-menu-link">Models</a></li><li class="pure-menu-item sub-item"><a href="/docs/documents.html" class="pure-menu-link">Documents</a></li><li class="pure-menu-item sub-item"><a href="/docs/subdocs.html" class="pure-menu-link">Subdocuments</a></li><li class="pure-menu-item sub-item"><a href="/docs/queries.html" class="pure-menu-link">Queries</a></li><li class="pure-menu-item sub-item"><a href="/docs/validation.html" class="pure-menu-link">Validation</a></li><li class="pure-menu-item sub-item"><a href="/docs/middleware.html" class="pure-menu-link">Middleware</a></li><li class="pure-menu-item sub-item"><a href="/docs/populate.html" class="pure-menu-link">Populate</a></li><li class="pure-menu-item sub-item"><a href="/docs/discriminators.html" class="pure-menu-link">Discriminators</a></li><li class="pure-menu-item sub-item"><a href="/docs/plugins.html" class="pure-menu-link">Plugins</a></li><li class="pure-menu-item"><a href="/docs/api.html" class="pure-menu-link">API</a></li><li class="pure-menu-item sub-item"><a href="/docs/api.html#mongoose_Mongoose" class="pure-menu-link">Mongoose</a></li><li class="pure-menu-item sub-item"><a href="/docs/api.html#Schema" class="pure-menu-link">Schema</a></li><li class="pure-menu-item sub-item"><a href="/docs/api.html#Connection" class="pure-menu-link">Connection</a></li><li class="pure-menu-item sub-item"><a href="/docs/api.html#Document" class="pure-menu-link">Document</a></li><li class="pure-menu-item sub-item"><a href="/docs/api.html#Model" class="pure-menu-link">Model</a></li><li class="pure-menu-item sub-item"><a href="/docs/api.html#Query" class="pure-menu-link">Query</a></li><li class="pure-menu-item sub-item"><a href="/docs/api.html#Aggregate" class="pure-menu-link">Aggregate</a></li><li class="pure-menu-item sub-item"><a href="/docs/api.html#Schematype" class="pure-menu-link">SchemaType</a></li><li class="pure-menu-item sub-item"><a href="/docs/api.html#Virtualtype" class="pure-menu-link">VirtualType</a></li><li class="pure-menu-item"><a href="/docs/compatibility.html" class="pure-menu-link">Version Compatibility</a></li><li class="pure-menu-item"><a href="/docs/faq.html" class="pure-menu-link">FAQ</a></li><li class="carbon-ad"><script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?zoneid=1673&serve=C6AILKT&placement=mongoosejscom" id="_carbonads_js"></script></li></ul></div></div><div class="container"><div id="content"><h2 id="declaring-defaults-in-your-schema"><a href="#declaring-defaults-in-your-schema"><p>Declaring defaults in your schema</p>
</a></h2><p><p>Your schemas can define default values for certain paths. If you create
a new document without that path set, the default will kick in.</p>
</p>
<pre><code class="lang-javscript"><span class="hljs-keyword">var</span> schema = <span class="hljs-keyword">new</span> Schema({
name: <span class="hljs-built_in">String</span>,
role: { type: <span class="hljs-built_in">String</span>, <span class="hljs-keyword">default</span>: <span class="hljs-string">'guitarist'</span> }
});
<span class="hljs-keyword">var</span> Person = db.model(<span class="hljs-string">'Person'</span>, schema);
<span class="hljs-keyword">var</span> axl = <span class="hljs-keyword">new</span> Person({ name: <span class="hljs-string">'Axl Rose'</span>, role: <span class="hljs-string">'singer'</span> });
assert.equal(axl.role, <span class="hljs-string">'singer'</span>);
<span class="hljs-keyword">var</span> slash = <span class="hljs-keyword">new</span> Person({ name: <span class="hljs-string">'Slash'</span> });
assert.equal(slash.role, <span class="hljs-string">'guitarist'</span>);
<span class="hljs-keyword">var</span> izzy = <span class="hljs-keyword">new</span> Person({ name: <span class="hljs-string">'Izzy'</span>, role: <span class="hljs-literal">undefined</span> });
assert.equal(izzy.role, <span class="hljs-string">'guitarist'</span>);
Person.create(axl, slash, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">error</span>) </span>{
assert.ifError(error);
Person.find({ role: <span class="hljs-string">'guitarist'</span> }, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">error, docs</span>) </span>{
assert.ifError(error);
assert.equal(docs.length, <span class="hljs-number">1</span>);
assert.equal(docs[<span class="hljs-number">0</span>].name, <span class="hljs-string">'Slash'</span>);
});
});
</code></pre>
<h2 id="default-functions"><a href="#default-functions"><p>Default functions</p>
</a></h2><p><p>You can also set the <code>default</code> schema option to a function. Mongoose will
execute that function and use the return value as the default.</p>
</p>
<pre><code class="lang-javscript"><span class="hljs-keyword">var</span> schema = <span class="hljs-keyword">new</span> Schema({
title: <span class="hljs-built_in">String</span>,
date: {
type: <span class="hljs-built_in">Date</span>,
<span class="hljs-comment">// `Date.now()` returns the current unix timestamp as a number</span>
<span class="hljs-keyword">default</span>: <span class="hljs-built_in">Date</span>.now
}
});
<span class="hljs-keyword">var</span> BlogPost = db.model(<span class="hljs-string">'BlogPost'</span>, schema);
<span class="hljs-keyword">var</span> post = <span class="hljs-keyword">new</span> BlogPost({title: <span class="hljs-string">'5 Best Arnold Schwarzenegger Movies'</span>});
<span class="hljs-comment">// The post has a default Date set to now</span>
assert.ok(post.date.getTime() >= <span class="hljs-built_in">Date</span>.now() - <span class="hljs-number">1000</span>);
assert.ok(post.date.getTime() <= <span class="hljs-built_in">Date</span>.now());
</code></pre>
<h2 id="the-setdefaultsoninsert-option"><a href="#the-setdefaultsoninsert-option"><p>The <code>setDefaultsOnInsert</code> option</p>
</a></h2><p><p>By default, mongoose only applies defaults when you create a new document.
It will <strong>not</strong> set defaults if you use <code>update()</code> and
<code>findOneAndUpdate()</code>. However, mongoose 4.x lets you opt-in to this
behavior using the <code>setDefaultsOnInsert</code> option.</p>
<h2 id="important">Important</h2>
<p>The <code>setDefaultsOnInsert</code> option relies on the
<a href="https://docs.mongodb.org/manual/reference/operator/update/setOnInsert/">MongoDB <code>$setOnInsert</code> operator</a>.
The <code>$setOnInsert</code> operator was introduced in MongoDB 2.4. If you're
using MongoDB server < 2.4.0, do <strong>not</strong> use <code>setDefaultsOnInsert</code>.</p>
</p>
<pre><code class="lang-javscript"><span class="hljs-keyword">var</span> schema = <span class="hljs-keyword">new</span> Schema({
title: <span class="hljs-built_in">String</span>,
genre: {type: <span class="hljs-built_in">String</span>, <span class="hljs-keyword">default</span>: <span class="hljs-string">'Action'</span>}
});
<span class="hljs-keyword">var</span> Movie = db.model(<span class="hljs-string">'Movie'</span>, schema);
<span class="hljs-keyword">var</span> query = {};
<span class="hljs-keyword">var</span> update = {title: <span class="hljs-string">'The Terminator'</span>};
<span class="hljs-keyword">var</span> options = {
<span class="hljs-comment">// Return the document after updates are applied</span>
<span class="hljs-keyword">new</span>: <span class="hljs-literal">true</span>,
<span class="hljs-comment">// Create a document if one isn't found. Required</span>
<span class="hljs-comment">// for `setDefaultsOnInsert`</span>
upsert: <span class="hljs-literal">true</span>,
setDefaultsOnInsert: <span class="hljs-literal">true</span>
};
Movie.
findOneAndUpdate(query, update, options, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">error, doc</span>) </span>{
assert.ifError(error);
assert.equal(doc.title, <span class="hljs-string">'The Terminator'</span>);
assert.equal(doc.genre, <span class="hljs-string">'Action'</span>);
});
</code></pre>
<h2 id="default-functions-and-this"><a href="#default-functions-and-this"><p>Default functions and <code>this</code></p>
</a></h2><p><p>Unless it is running on a query with <code>setDefaultsOnInsert</code>, a default
function's <code>this</code> refers to the document.</p>
</p>
<pre><code class="lang-javscript"><span class="hljs-keyword">const</span> schema = <span class="hljs-keyword">new</span> Schema({
title: <span class="hljs-built_in">String</span>,
released: <span class="hljs-built_in">Boolean</span>,
releaseDate: {
type: <span class="hljs-built_in">Date</span>,
<span class="hljs-keyword">default</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.released) {
<span class="hljs-keyword">return</span> <span class="hljs-built_in">Date</span>.now();
}
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
}
});
<span class="hljs-keyword">const</span> Movie = db.model(<span class="hljs-string">'Movie'</span>, schema);
<span class="hljs-keyword">const</span> movie1 = <span class="hljs-keyword">new</span> Movie({ title: <span class="hljs-string">'The Terminator'</span>, released: <span class="hljs-literal">true</span> });
<span class="hljs-comment">// The post has a default Date set to now</span>
assert.ok(movie1.releaseDate.getTime() >= <span class="hljs-built_in">Date</span>.now() - <span class="hljs-number">1000</span>);
assert.ok(movie1.releaseDate.getTime() <= <span class="hljs-built_in">Date</span>.now());
<span class="hljs-keyword">const</span> movie2 = <span class="hljs-keyword">new</span> Movie({ title: <span class="hljs-string">'The Legend of Conan'</span>, released: <span class="hljs-literal">false</span> });
<span class="hljs-comment">// Since `released` is false, the default function will return null</span>
assert.strictEqual(movie2.releaseDate, <span class="hljs-literal">null</span>);
</code></pre>
</div></div><script type="text/javascript">!function(name,path,ctx){
var latest,prev=name!=='Keen'&&window.Keen?window.Keen:false;ctx[name]=ctx[name]||{ready:function(fn){var h=document.getElementsByTagName('head')[0],s=document.createElement('script'),w=window,loaded;s.onload=s.onerror=s.onreadystatechange=function(){if((s.readyState&&!(/^c|loade/.test(s.readyState)))||loaded){return}s.onload=s.onreadystatechange=null;loaded=1;latest=w.Keen;if(prev){w.Keen=prev}else{try{delete w.Keen}catch(e){w.Keen=void 0}}ctx[name]=latest;ctx[name].ready(fn)};s.async=1;s.src=path;h.parentNode.insertBefore(s,h)}}
}('KeenAsync','https://d26b395fwzu5fz.cloudfront.net/keen-tracking-1.1.3.min.js',this);
KeenAsync.ready(function(){
// Configure a client instance
var client = new KeenAsync({
projectId: '59aad9cbc9e77c0001ce1b32',
writeKey: '4B38B0046086885E425D368BFAEAD8FD0D4F2DC2FA2F936FDE058D79508AEFAD9886BC020B96520823BB9C8241D9D9BCFDC0EF52E6033BD89D06E4B24FC13AE955896BF443406269A84DD009CEB5862DCEC944874DB2107FD648DA91ADC1E6DE'
});
client.recordEvent('pageView', {
host: window.location.host,
pathname: window.location.pathname,
hash: window.location.hash
});
});</script><script type="text/javascript">(function (window, document) {
var layout = document.getElementById('layout'),
menu = document.getElementById('menu'),
menuLink = document.getElementById('menuLink'),
content = document.getElementById('content');
function toggleClass(element, className) {
var classes = element.className.split(/\s+/),
length = classes.length,
i = 0;
for(; i < length; i++) {
if (classes[i] === className) {
classes.splice(i, 1);
break;
}
}
// The className is not found
if (length === classes.length) {
classes.push(className);
}
element.className = classes.join(' ');
}
function toggleAll(e) {
var active = 'active';
e.preventDefault();
toggleClass(layout, active);
toggleClass(menu, active);
toggleClass(menuLink, active);
}
menuLink.onclick = function (e) {
toggleAll(e);
};
content.onclick = function(e) {
if (menu.className.indexOf('active') !== -1) {
toggleAll(e);
}
};
}(this, this.document));</script></div></body></html>