mongoDB看这篇就够了
<h2 id="写在前面">写在前面</h2><p>hello,小伙伴们,我是 <code>pubdreamcc</code> ,本篇文章依旧出至于我的 GitHub仓库<code>node学习教程</code> ,如果你觉得我写的还不错,欢迎给个 <code>star</code> ,小伙伴们的 <code>star</code> 是我持续更新的动力 !</p>
<blockquote>
<p>node学习教程GitHub</p>
</blockquote>
<h2 id="安装-mongodb">安装 <code>mongoDB</code></h2>
<p>安装这里,我就不详细介绍,大家可以根据官网选择匹配自己电脑系统的版本安装即可。</p>
<p>mongoDB download地址: download</p>
<p>下载下来之后,点击打开直接下一步,下一步就 <code>ok </code> 了。</p>
<h2 id="初体验">初体验</h2>
<ol>
<li>配置环境变量</li>
</ol>
<p>安装完成后,会在安装目录下面生成一个 <code>mongoDB</code> 的文件夹,打开文件夹,进入 <code>bin </code> 文件夹中,把这里的路径配置成环境变量。</p>
<ol start="2">
<li>创建存储数据库文件 <code>data</code></li>
</ol>
<p>在任意盘符根目录下创建一个 <code>data</code> 目录,用来存放数据库文件。 <code>mongoDB</code> 会自动把自己安装位置的盘符根目录下的 <code>data</code> 文件夹作为自己的数据存储目录,这里也可以直接在安装位置所在盘符创建。</p>
<ol start="3">
<li>启动 mongoDB 数据库</li>
</ol>
<p>如果 <code>data</code> 目录创建在安装位置的盘符根目录下,直接<br>
打开命令行,敲入:</p>
<pre><code class="language-shell">mongod
</code></pre>
<p>如果是其他位置,则需要指定数据存放的位置:</p>
<pre><code class="language-shell">mongod --dbpath 文件路径
</code></pre>
<p>如果看到输出: <code> waiting for connections on port 27017</code> 说明启动数据库成功。</p>
<ol start="4">
<li>连接数据库</li>
</ol>
<p>再打开一个命令行,敲入 <code>mongo</code> ,则会默认连接到本地开启的数据库。好了,到这里我们就完成了如何开启一个 <code>mongoDB</code>数据库了,接下来只需往数据库里存数据,操作数据即可。</p>
<h2 id="mongodb-概念解析"><code>MongoDB</code> 概念解析</h2>
<p>在<code>mongodb</code>中有三个基本核心的概念:</p>
<ul>
<li>
<p>文档</p>
</li>
<li>
<p>集合</p>
</li>
<li>
<p>数据库</p>
</li>
</ul>
<p>它们之间是逐层包含的关系,一个集合可以包含多个文档,一个数据库可以有多个集合,下面听我逐一道来:</p>
<p><code>文档</code> : 文档是一个键值(<code>key-value</code>)对(即<code>BSON</code>),本质类似于<code>json</code>对象 的键值对。</p>
<pre><code class="language-json">{"name":"pubdreamcc", "age": 24}
</code></pre>
<p><code>集合</code>:集合就是 MongoDB 文档组,实质上就是包含多个对象的数组。</p>
<p>比如,我们可以将以下不同数据结构的文档插入到集合中:</p>
<pre><code class="language-javascript">{"name":"pubdreamcc"}
{"name":"pubdreamcc1","name":"pubdreamcc2"}
{"name":"pubdreamcc3","name":"pubdreamcc4","num":5}
</code></pre>
<p><code>数据库(dataBase)</code></p>
<p>这里的数据库概念同 关系型数据库中的数据库概念一致,数据库可以包含多个集合。</p>
<p>下面给出一张图用来表示 <code>mongoDB</code> 中的一些概念同 <code>SQL</code> 概念 的 对比,辅助理解。</p>
<p><img src="https://img2018.cnblogs.com/blog/1632878/201905/1632878-20190531141550555-1902347207.png" alt="" loading="lazy"></p>
<h2 id="mongodb基本操作"><code>mongoDB</code>基本操作</h2>
<p>在刚才我们连接上本地数据库之后,在这个命令行,我们可以进行很多<code>mongoDB</code>提供的增删改查等的基本操作,且听我一一道来。</p>
<ol>
<li>创建数据库 : <code>use 数据库名称</code>。</li>
</ol>
<p><em>如果数据库不存在,则创建数据库,否则切换到指定数据库。</em></p>
<p><em>MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。</em></p>
<ol start="2">
<li>
<p>查看所有数据库: <code> show dbs</code></p>
</li>
<li>
<p>删除数据库: <code>db.dropDatabase()</code>,你可以使用 db 命令查看当前数据库名。</p>
</li>
<li>
<p>创建集合:<code>db.createCollection(集合名称)</code></p>
</li>
<li>
<p>查看已有集合: <code>show collections</code></p>
</li>
<li>
<p>删除集合:<code>db.集合名称.drop()</code></p>
</li>
</ol>
<p><em>如果成功删除选定集合,则 <code>drop()</code> 方法返回 <code>true</code>,否则返回 <code>false</code>。</em></p>
<ol start="7">
<li>
<p>插入文档:<code>db.集合名称.insert(document)</code>。往指定集合插入文档,文档的数据结构和 <code>JSON</code> 基本一样。</p>
</li>
<li>
<p>更新文档: <code>update()</code> 方法用于更新已存在的文档,语法格式:</p>
</li>
</ol>
<pre><code class="language-javascript">db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
</code></pre>
<p><strong>参数说明</strong>:</p>
<ul>
<li>
<p><code>query</code> : update的查询条件,类似sql update查询内where后面的。</p>
</li>
<li>
<p><code>update</code> : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的。</p>
</li>
<li>
<p><code>upsert</code> : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。</p>
</li>
<li>
<p><code>multi</code> : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。</p>
</li>
<li>
<p><code>writeConcern</code> :可选,抛出异常的级别。</p>
</li>
</ul>
<ol start="9">
<li>删除文档:</li>
</ol>
<pre><code class="language-javascript">db.collection.remove(
<query>,
<justOne>
)
</code></pre>
<p><strong>参数说明</strong></p>
<ul>
<li>
<p><code>query</code> :(可选)删除的文档的条件。</p>
</li>
<li>
<p><code>justOne</code> : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。</p>
</li>
<li>
<p><code>writeConcern</code> :(可选)抛出异常的级别。</p>
</li>
</ul>
<ol start="10">
<li>
<p>删除集合所有数据:<code>db.collection.remove({})</code></p>
</li>
<li>
<p>查询文档:<code>db.collection.find(query, projection)</code></p>
</li>
</ol>
<p><strong>参数说明</strong></p>
<ul>
<li>
<p><code>query</code> :可选,使用查询操作符指定查询条件。</p>
</li>
<li>
<p><code>projection</code> :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。</p>
</li>
</ul>
<p><code>PS</code>:</p>
<p>如果你需要以易读的方式来读取数据,可以使用 <code>pretty()</code> 方法,语法格式如下:</p>
<pre><code class="language-json">db.col.find().pretty()
</code></pre>
<p><code>pretty()</code> 方法以格式化的方式来显示所有文档。</p>
<ol start="12">
<li>查询一个文档(匹配条件的第一个):<code>db.collection.findOne()</code></li>
</ol>
<h2 id="node操作mongodb">Node操作mongoDB</h2>
<p>方法一:</p>
<ul>
<li>使用 <code>mongoDB</code> 官方提供的 <code>node mongodb driver </code> 包 <code>mongoDB</code> ,这种方法是官方提供的,感兴趣的同学可以去 npm 官网查找文档,这里推荐下面一种方法。</li>
</ul>
<blockquote>
<p><code>mongoDB</code> npm 文档</p>
</blockquote>
<p>方法二:</p>
<ul>
<li>使用 <code>mongoose </code></li>
</ul>
<p><code>Mongoose</code> 是在 <code>node.js</code> 环境下对 <code>mongodb</code> 进行便捷操作的对象模型工具。</p>
<p>官方 api 文档</p>
<p>下面说明下 <code>mongoose</code> 的具体用法。</p>
<ol>
<li>安装 <code>mongoose</code></li>
</ol>
<pre><code class="language-shell">npm install mongoose
</code></pre>
<p>安装完成后,打开mongodb。命令行敲入:<code>mongod</code>,即可打开 mongodb</p>
<ol start="2">
<li>利用mongoose连接mongodb</li>
</ol>
<p>新建一个js文件,引入mongoose,这里可以参照官网 写的一个 <code>hello world</code> 。</p>
<pre><code class="language-javascript">const mongoose = require('mongoose')
// 连接数据库
mongoose.connect('mongodb://数据库地址(包括端口号)/数据库名称', (err, ret) => {
if (err) {
console.log('连接失败')
} else {
console.log('连接成功')
}
})
</code></pre>
<p>这样,我们就可以连接上数据库了,注意:如果没有指定数据库名称,则默认连接 <code>test</code> 数据库。</p>
<ol start="3">
<li>创建 <code>Schema</code> ,设计文档结构</li>
</ol>
<p><code>Schema</code> 到底是个什么东西呢,我们在往数据库插入数据之前是不是应该得稍微设计下文档的结构,也就是关系数据库中表的结构啥的,因为有一定的设计才使得数据的完整性,不会产生脏数据,Schema就是用来干这个事情的,我们看下官方的介绍</p>
<p><code>Schema</code> 主要用于定义 <code>MongoDB</code> 中集合 <code>Collection</code> 里文档 <code>document</code> 的结构。<code>mongoose</code> 对表结构的定义,每个 <code>Schema</code> 会映射到mongodb中的一个 <code>collection</code>,<code>Schema</code> 不具备操作数据库的能力。</p>
<p>定义<code>Schema</code>非常简单,指定字段名和类型即可,支持的类型包括以下8种:</p>
<pre><code>String 字符串
Number 数字
Date 日期
Buffer 二进制
Boolean 布尔值
Mixed 混合类型
ObjectId 对象ID
Array 数组
</code></pre>
<p>通过<code>mongoose.Schema</code>来调用Schema,然后使用new方法来创建schema</p>
<pre><code class="language-javascript">// 引入Schema
const Schema = mongoose.Schema
// 通过 new 创建一个Schema
const userSchema = new Schema({
// 这里来设计文档的结构,后面插入集合的每一个文档必须是以下指定的结构
name: {
type: String,
required: true //规定 name 是必须有的字段
},
password: {
type: String,
required: true
},
email: {
type: String
}
})
</code></pre>
<p>通过以上的实例,我们就创建了一个 <code>userSchema</code> 的架构,规定了每个文档中必须有 <code>name</code>, <code>password</code> 字段,且类型为 <code>String</code>,<code>email</code> 字段类型为 <code>String</code>,有或没有都可以。</p>
<ol start="4">
<li>把 <code>Schema</code> 发布为 <code>model</code> (模型)</li>
</ol>
<p>简单说就是<code>model</code>是由 <code>Schema</code> 生成的模型,可以对数据库的操作。model的每一个实例(instance)就是一个文档。</p>
<p>把 Schema 发布为模型只需调用mongoose的 <code>mongoose.model()</code> 方法即可,<code>mongoose.model()</code> 接收两个参数,第一个参数表示模型的名称,第二个参数是 Schema,返回值为模型构造函数。这里一定得把第一个参数设置成和 <code>mongoose.model()</code> 的返回值相同,否则会出错。最后得到的集合名称就为模型名称的小写形式,如果模型名称最后一个字符是字母,则变成复数形式,如果最后一个是数字,则不变,比如:模型名称:<code>User</code>,得到的集合名称为: <code>users</code>,模型名称为:<code>User1</code>, 得到的集合名称为;<code>user1</code>。</p>
<pre><code class="language-javascript">// 把Schema 发布为模型
const User = mongoose.model('User', userSchema)
</code></pre>
<ol start="5">
<li>通过模型构造函数,可以对数据库进行一系列增删改查的操作。</li>
</ol>
<p>好了,我们经过以上的步骤,最后就可以通过 <code>User</code> 模型构造函数操作数据库了。</p>
<h2 id="mongoose-操作-mongodb">mongoose 操作 mongoDB</h2>
<h3 id="增加数据">增加数据</h3>
<p>实例化一个模型构造函数就得到一个具体文档。</p>
<pre><code class="language-javascript">const user = new User({
// 传入具体的数据信息,必须和之前的Schema 配置的结构一致
name: 'pubdreamcc',
password: '123456',
email: '333@pubdreamcc.com' // 可有可无
})
// 通过save()方法持久化存储数据
user.save((err, ret) => {
if (err) {
console.log('保存失败')
} else {
console.log('保存成功')
console.log(ret) // ret 就是刚新增加的文档
}
})
</code></pre>
<p>ok, 通过上面两步我们就已经保存了一条数据到数据库中了,就是怎么简单。</p>
<h3 id="查询数据">查询数据</h3>
<p>查询数据这里有好几个 API , 可以看下 mongoose 的官网:</p>
<ul>
<li>find()</li>
<li>findById()</li>
<li>findOne()</li>
</ul>
<p>具体的用法和之前在控制台 操作mongoDB 数据类似,不清楚的同学可以查看本章第一节知识点: mongoDB数据库的使用</p>
<p>这里选取一个findOne代表</p>
<pre><code class="language-javascript">User.findOne({name: 'pubdreamcc'}, (err, ret) => {
if (err) {
console.log('查询失败')
} else {
console.log(ret) // ret 即为查询出来的那一条文档
}
})
</code></pre>
<p><code>findOne()</code> 会查找匹配的第一个文档出来,通常传入一个查找条件(对象),这里是从数据库查找 <code>name</code>为 <code>pubdreamcc</code>的文档出来。</p>
<h3 id="删除数据">删除数据</h3>
<p>删除数据同样也有好几个方法,这里参照官网 api :</p>
<ul>
<li>remove()</li>
<li>findOneAndRemove()</li>
<li>findByIdAndRemove()</li>
</ul>
<p>用法其实和更新数据,包括前面说到的查找数据类似,<code>remove()</code> 会删除所有匹配的全部文档,<code>findOneAndRemove()</code> 会删除匹配的第一个文档,<code>findByIdAndRemove()</code> 通过唯一的id值删除某一个文档。</p>
<p>这里选取<code>findByIdAndRemove()</code> 来说明,其他的小伙伴可以去 <code>mongoose</code> 官网 <code>api</code> 查询,我就不再反复说了,用法很简单,大家看一下都懂的。</p>
<blockquote>
<p>mongoose 官网 api: api document</p>
</blockquote>
<pre><code class="language-javascript">User.findByIdAndRemove('id值', (err, ret) => {
if (err) {
console.log('删除失败')
} else {
console.log('删除成功')
console.log(ret) // ret 即为删除信息反馈对象,包括成功删了几条数据等
}
})
</code></pre>
<h3 id="更新数据">更新数据</h3>
<p>更新数据也有几个 api 可以供我们使用,我就罗列下,然后也是选取一个加以说明,其他的小伙伴们可以去官网查看 api 即可。</p>
<ul>
<li>findByIdAndUpdate()</li>
<li>update()</li>
<li>findOneAndUpdate()</li>
</ul>
<p>这里选取 <code>update()</code> 来演示下:</p>
<pre><code class="language-javascript">User.update({name: 'pubdreamcc'}, {email: '111@pubdreamcc.com'}, (err, ret) => {
if (err) {
console.log('更新失败')
} else {
console.log('更新成功')
}
})
</code></pre>
<p><code>update()</code> 方法会把所有满足条件的数据都更新,上面我们已经把 <code>name</code> 为: <code>pubdreamcc</code> 的所有文档的<code>email</code> 都修改为 <code>111@pubdreamcc.com</code> 。</p>
<h2 id="总结">总结</h2>
<p>本文也是我查阅相关资料,看了很多mongoDB的资料总结而来,如果有那些地方有差错,欢迎留言评论。</p>
<p>需要演示的源代码可以去GitHub仓库查看。</p>
<p>ok,that's all , thank you !</p><br><br>
来源:https://www.cnblogs.com/dreamcc/p/10955069.html
頁:
[1]