doctype html
html(lang='en')
head
meta(charset="utf-8")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
title #{title} - Mongoose v#{package.version}
//- Inline script to prevent flash of wrong theme — must run before CSS loads
script.
(function() {
var theme = localStorage.getItem('mongoose-theme');
if (theme) {
document.documentElement.setAttribute('data-theme', theme);
}
})();
include ./includes/favicon
block style
link(rel="stylesheet", href="https://fonts.googleapis.com/css?family=Open+Sans:wght@400;500;600;700&display=swap")
link(rel="stylesheet", href=`${versions.versionedPath}/docs/css/mongoose9.css?v=${Date.now()}`)
link(rel="stylesheet", href=`${versions.versionedPath}/docs/css/github.css?v=${Date.now()}`)
link(rel="stylesheet", href=`${versions.versionedPath}/docs/css/carbonads.css`)
link(rel="stylesheet", href=`${versions.versionedPath}/docs/css/copy-code.css`)
meta(name='msapplication-TileColor', content='#ffffff')
meta(name='msapplication-TileImage', content=`${versions.versionedPath}/docs/images/favicon/ms-icon-144x144.png`)
meta(name='theme-color', content='#ffffff')
body
block layout
- const docsHome = `${versions.versionedPath}/docs/index.html`
- const apiHome = `${versions.versionedPath}/docs/api/mongoose.html`
- const migrationHome = `${versions.versionedPath}/docs/migrating_to_9.html`
- const faqHome = `${versions.versionedPath}/docs/faq.html`
- const isApiPage = outputUrl.startsWith(`${versions.versionedPath}/docs/api/`)
- const isMigrationPage = outputUrl === migrationHome
- const isFaqPage = outputUrl === faqHome
- const isDocsPage = !isApiPage && !isMigrationPage && !isFaqPage
header.site-header
.site-header-inner
button.mobile-menu-toggle#menuLink(aria-label="Toggle navigation")
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M4 7h16M4 12h16M4 17h16"/></svg>
a.site-logo(href="/")
.site-logo-inner
span.site-logo-mark(role="img" aria-label="Mongoose logo")
span.site-logo-text mongoose
.site-search
input#search-input-nav(type="text", placeholder="Search", aria-label="Search")
button.site-search-button#search-button-nav(aria-label="Search")
img(src=`${versions.versionedPath}/docs/images/search.svg`)
nav.top-navbar(aria-label="Primary")
a.top-navbar-link(href=docsHome, class=isDocsPage ? 'active' : '') Docs
a.top-navbar-link(href=apiHome, class=isApiPage ? 'active' : '') API
a.top-navbar-link(href=migrationHome, class=isMigrationPage ? 'active' : '') Migration
a.top-navbar-link(href=faqHome, class=isFaqPage ? 'active' : '') FAQ
.site-actions
button.icon-button#theme-toggle-btn(aria-label="Toggle dark mode" title="Toggle dark/light theme")
<svg id="theme-icon-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
<svg id="theme-icon-dark" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>
a.icon-link(href="https://github.com/Automattic/mongoose", target="_blank", rel="noopener", aria-label="GitHub repository")
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.65.5.5 5.65.5 12a11.5 11.5 0 0 0 7.86 10.92c.58.1.79-.25.79-.55v-2c-3.2.7-3.87-1.37-3.87-1.37-.52-1.32-1.28-1.67-1.28-1.67-1.05-.72.08-.7.08-.7 1.16.08 1.77 1.19 1.77 1.19 1.03 1.77 2.7 1.26 3.36.96.1-.75.4-1.26.73-1.55-2.56-.29-5.25-1.28-5.25-5.7 0-1.26.45-2.29 1.18-3.1-.12-.29-.52-1.47.11-3.06 0 0 .97-.31 3.18 1.18a11.04 11.04 0 0 1 5.78 0c2.2-1.49 3.17-1.18 3.17-1.18.63 1.59.23 2.77.12 3.06.74.81 1.18 1.84 1.18 3.1 0 4.44-2.7 5.4-5.27 5.69.41.35.77 1.05.77 2.12v3.14c0 .31.2.66.8.55A11.5 11.5 0 0 0 23.5 12C23.5 5.65 18.35.5 12 .5z"/></svg>
button.icon-button.mobile-toc-toggle#tocLink(aria-label="Toggle table of contents" aria-controls="toc-sidebar" title="Table of contents")
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M8 6h12M8 12h12M8 18h12"/><path d="M4 6h.01M4 12h.01M4 18h.01"/></svg>
#layout.site-body
aside.left-sidebar#menu
- const pastVersionsHref = (p) => `/docs/${p}/index.html`
.version-picker#version-picker
.version-picker-label Version
button.version-picker-button(type="button" aria-haspopup="true" aria-expanded="false")
span.version-picker-current v#{versions.currentVersion.listed}
<svg class="version-picker-caret" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
ul.version-picker-menu(role="menu")
- if (versions.currentVersion.listed !== versions.latestVersion.listed)
li
a.version-picker-item(role="menuitem" href=`${versions.latestVersion.path}/docs/index.html`) v#{versions.latestVersion.listed} (latest)
each pastVersion in versions.pastVersions
li
a.version-picker-item(role="menuitem" href=pastVersionsHref(pastVersion.path)) v#{pastVersion.listed}
mixin sidebarItem(rel, label)
- const href = `${versions.versionedPath}/docs/${rel}`
li.sidebar-item
a.sidebar-link(href=href, class=outputUrl === href ? 'active' : '')= label
block
mixin sidebarSectionCarat
<svg class="sidebar-section-caret" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
nav.sidebar-nav(aria-label="Docs navigation")
.sidebar-section.sidebar-section-collapsible#sidebar-section-getting-started
h3.sidebar-section-title.sidebar-section-toggle(role="button" tabindex="0" aria-expanded="true" aria-controls="sidebar-list-getting-started")
span Getting Started
+sidebarSectionCarat
ul.sidebar-list#sidebar-list-getting-started
+sidebarItem('index.html', 'Quick Start')
+sidebarItem('guides.html', 'All Guides')
.sidebar-section.sidebar-section-collapsible#sidebar-section-guides
h3.sidebar-section-title.sidebar-section-toggle(role="button" tabindex="0" aria-expanded="true" aria-controls="sidebar-list-guides")
span Guides
+sidebarSectionCarat
ul.sidebar-list#sidebar-list-guides
+sidebarItem('guide.html', 'Schemas')
+sidebarItem('schematypes.html', 'SchemaTypes')
+sidebarItem('connections.html', 'Connections')
- if ([`${versions.versionedPath}/docs/connections`, `${versions.versionedPath}/docs/tutorials/ssl`].some(path => outputUrl.startsWith(path)))
ul.sidebar-children
+sidebarItem('tutorials/ssl.html', 'TLS/SSL Connections')
+sidebarItem('models.html', 'Models')
- if ([`${versions.versionedPath}/docs/models`, `${versions.versionedPath}/docs/change-streams`].some(path => outputUrl.startsWith(path)))
ul.sidebar-children
+sidebarItem('change-streams.html', 'Change Streams')
+sidebarItem('documents.html', 'Documents')
+sidebarItem('subdocs.html', 'Subdocuments')
+sidebarItem('queries.html', 'Queries')
- if ([`${versions.versionedPath}/docs/queries`, `${versions.versionedPath}/docs/tutorials/findoneandupdate`, `${versions.versionedPath}/docs/tutorials/lean`, `${versions.versionedPath}/docs/tutorials/query_casting`].some(path => outputUrl.startsWith(path)))
ul.sidebar-children
+sidebarItem('tutorials/query_casting.html', 'Query Casting')
+sidebarItem('tutorials/findoneandupdate.html', 'findOneAndUpdate')
+sidebarItem('tutorials/lean.html', 'The Lean Option')
+sidebarItem('validation.html', 'Validation')
+sidebarItem('middleware.html', 'Middleware')
+sidebarItem('populate.html', 'Populate')
+sidebarItem('discriminators.html', 'Discriminators')
+sidebarItem('plugins.html', 'Plugins')
+sidebarItem('timestamps.html', 'Timestamps')
+sidebarItem('transactions.html', 'Transactions')
+sidebarItem('atlas-search.html', 'Atlas Search')
- if ([`${versions.versionedPath}/docs/atlas-search`, `${versions.versionedPath}/docs/atlas-vector-search`].some(path => outputUrl.startsWith(path)))
ul.sidebar-children
+sidebarItem('atlas-vector-search.html', 'Vector Search')
+sidebarItem('typescript.html', 'TypeScript')
- if (outputUrl.startsWith(`${versions.versionedPath}/docs/typescript`))
ul.sidebar-children
+sidebarItem('typescript/schemas.html', 'Schemas')
+sidebarItem('typescript/statics-and-methods.html', 'Statics and Methods')
+sidebarItem('typescript/queries.html', 'Queries')
+sidebarItem('typescript/query-helpers.html', 'Query Helpers')
+sidebarItem('typescript/populate.html', 'Populate')
+sidebarItem('typescript/virtuals.html', 'Virtuals')
+sidebarItem('typescript/subdocuments.html', 'Subdocuments')
.sidebar-section.sidebar-section-collapsible#sidebar-section-api-reference
h3.sidebar-section-title.sidebar-section-toggle(role="button" tabindex="0" aria-expanded="true" aria-controls="sidebar-list-api-reference")
span API Reference
+sidebarSectionCarat
ul.sidebar-list#sidebar-list-api-reference
+sidebarItem('api/mongoose.html', 'Mongoose')
+sidebarItem('api/schema.html', 'Schema')
+sidebarItem('api/connection.html', 'Connection')
+sidebarItem('api/document.html', 'Document')
+sidebarItem('api/model.html', 'Model')
+sidebarItem('api/query.html', 'Query')
+sidebarItem('api/aggregate.html', 'Aggregate')
+sidebarItem('api/schematype.html', 'SchemaType')
+sidebarItem('api/virtualtype.html', 'VirtualType')
.sidebar-section.sidebar-section-collapsible#sidebar-section-reference
h3.sidebar-section-title.sidebar-section-toggle(role="button" tabindex="0" aria-expanded="true" aria-controls="sidebar-list-reference")
span Reference
+sidebarSectionCarat
ul.sidebar-list#sidebar-list-reference
+sidebarItem('migrating_to_9.html', 'Migration Guide')
+sidebarItem('compatibility.html', 'Version Compatibility')
+sidebarItem('version-support.html', 'Version Support')
+sidebarItem('faq.html', 'FAQ')
+sidebarItem('further_reading.html', 'Further Reading')
.sidebar-section.sidebar-section-collapsible#sidebar-section-community
h3.sidebar-section-title.sidebar-section-toggle(role="button" tabindex="0" aria-expanded="true" aria-controls="sidebar-list-community")
span Community
+sidebarSectionCarat
ul.sidebar-list#sidebar-list-community
+sidebarItem('enterprise.html', 'For Enterprise')
+sidebarItem('sponsors.html', 'Sponsors')
main.site-main
article.article#content
block content
aside.right-sidebar#toc-sidebar
nav.toc#toc(aria-label="On this page")
h2.toc-title On This Page
ul.toc-list#toc-list
.right-sidebar-aside
- if (!(affiliateAd && affiliateAd.image))
.cpc-ad
<script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?zoneid=1673&serve=C6AILKT&placement=mongoosejscom" id="_carbonads_js"></script>
- if (affiliateAd && affiliateAd.image)
.affiliate-ad
- if (affiliateAd.href)
a(href=affiliateAd.href, target="_blank", rel="noopener sponsored")
img(src=`${versions.versionedPath}${affiliateAd.image}`, alt="Sponsored")
- else
img(src=`${versions.versionedPath}${affiliateAd.image}`, alt="Sponsored")
.assistant-panel#assistant-panel(aria-label="Mongoose docs assistant" aria-hidden="true")
.assistant-panel-resize#assistant-panel-resize(role="separator", aria-orientation="vertical", aria-label="Resize assistant")
.assistant-panel-header
.assistant-panel-title
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M12 3l1.7 5.1L19 10l-5.3 1.9L12 17l-1.7-5.1L5 10l5.3-1.9L12 3z"/><path d="M19 15l.8 2.2L22 18l-2.2.8L19 21l-.8-2.2L16 18l2.2-.8L19 15z"/></svg>
span Assistant
button.assistant-panel-close#assistant-panel-close(type="button", aria-label="Close assistant")
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"/></svg>
.assistant-thread#assistant-thread(aria-live="polite")
form.assistant-panel-form#assistant-panel-form
textarea.assistant-panel-input#assistant-panel-input(rows="3", placeholder="Ask a question...", aria-label="Ask the assistant")
button.assistant-panel-submit#assistant-panel-submit(type="submit", aria-label="Send question")
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 19V5"/><path d="m5 12 7-7 7 7"/></svg>
form.assistant-floating-form#assistant-floating-form
textarea.assistant-floating-input#assistant-floating-input(rows="1", placeholder="Ask a question...", aria-label="Ask a question about Mongoose")
span.assistant-floating-shortcut Ctrl+I
button.assistant-floating-submit#assistant-floating-submit(type="submit", aria-label="Ask")
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 19V5"/><path d="m5 12 7-7 7 7"/></svg>
script(type="text/javascript" src=`${versions.versionedPath}/docs/js/navbar-search.js`)
script(type="text/javascript" src=`${versions.versionedPath}/docs/js/mobile-navbar-toggle.js`)
script(type="text/javascript" src=`${versions.versionedPath}/docs/js/theme-toggle.js`)
script(type="text/javascript" src=`${versions.versionedPath}/docs/js/copy-code.js`)
script(type="text/javascript" src=`${versions.versionedPath}/docs/js/version-picker.js`)
script(type="text/javascript" src=`${versions.versionedPath}/docs/js/sidebar-collapse.js`)
script(type="text/javascript" src=`${versions.versionedPath}/docs/js/toc.js`)
script(type="text/javascript" src=`${versions.versionedPath}/docs/js/ask-ai.js`)