MongoDB详解,用心看这篇就够了【重点】

1.1 MongoDB概述
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

MongoDB服务端可运行在Linux、Windows平台,支持32位和64位应用,默认端口为27017。
推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

1.2 MongoDB 主要特点

1.2.1 文档

MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。
多个键及其关联的值有序地放在一起就构成了文档。
MongoDB文档类似于JSON对象。字段的值可以包括其他文档,数组和文档数组。

{“greeting”:“hello,world”}这个文档只有一个键“greeting”,对应的值为“hello,world”。多数情况下,文档比这个更复杂,它包含多个键/值对。

例如:{“greeting”:“hello,world”,“foo”: 3} 文档中的键/值对是有序的,下面的文档与上面的文档是完全不同的两个文档。{“foo”: 3 ,“greeting”:“hello,world”}

文档中的值不仅可以是双引号中的字符串,也可以是其他的数据类型,例如,整型、布尔型等,也可以是另外一个文档,即文档可以嵌套。文档中的键类型只能是字符串。

使用文档的优点是:

文档(即对象)对应于许多编程语言中的本机数据类型
嵌入式文档和数组减少了对昂贵连接的需求
动态模式支持流畅的多态性

1.3.2 集合
集合就是一组文档,类似于关系数据库中的表。

集合是无模式的,集合中的文档可以是各式各样的。例如,{“hello,word”:“Mike”}和{“foo”: 3},它们的键不同,值的类型也不同,但是它们可以存放在同一个集合中,也就是不同模式的文档都可以放在同一个集合中。

既然集合中可以存放任何类型的文档,那么为什么还需要使用多个集合?
这是因为所有文档都放在同一个集合中,无论对于开发者还是管理员,都很难对集合进行管理,而且这种情形下,对集合的查询等操作效率都不高。所以在实际使用中,往往将文档分类存放在不同的集合中。
例如,对于网站的日志记录,可以根据日志的级别进行存储,Info级别日志存放在Info 集合中,Debug 级别日志存放在Debug 集合中,这样既方便了管理,也提供了查询性能。
但是需要注意的是,这种对文档进行划分来分别存储并不是MongoDB 的强制要求,用户可以灵活选择。

可以使用“.”按照命名空间将集合划分为子集合。
例如,对于一个博客系统,可能包括blog.user 和blog.article 两个子集合,这样划分只是让组织结构更好一些,blog 集合和blog.user、blog.article 没有任何关系。虽然子集合没有任何特殊的地方,但是使用子集合组织数据结构清晰,这也是MongoDB 推荐的方法。

1.3.3 数据库
MongoDB 中多个文档组成集合,多个集合组成数据库。

一个MongoDB 实例可以承载多个数据库。它们之间可以看作相互独立,每个数据库都有独立的权限控制。在磁盘上,不同的数据库存放在不同的文件中。

MongoDB 中存在以下系统数据库。

Admin 数据库:一个权限数据库,如果创建用户的时候将该用户添加到admin 数据库中,那么该用户就自动继承了所有数据库的权限。
Local 数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。
Config 数据库:当MongoDB 使用分片模式时,config 数据库在内部使用,用于保存分片的信息。
1.3.4 数据模型
一个MongoDB 实例可以包含一组数据库,一个DataBase 可以包含一组Collection(集合),一个集合可以包含一组Document(文档)。

一个Document包含一组field(字段),每一个字段都是一个key/value pairkey: 必须为字符串类型
value:可以包含如下类型
基本类型,例如,string,int,float,timestamp,binary 等类型
一个document
数组类型
1.4 Windows安装MongoDB
1.4.1 下载MongoDB
MongoDB提供了可用于32位系统和64位系统的预编译二进制包(新版本没有了32位系统的安装文件),你可以进入MongoDB官网下载安装,MongoDB的预编译二进制包的下载地址为:

1.4.2 安装MongoDB

双击打开文件进行安装,在安装过程中,可以通过点击 “Custom(自定义)” 按钮来设置你的安装目录。

这里我选择安装在E:\MongoDB这个目录下(安装目录会影响我们后面的配置)
 

这里选择直接next
 

这里安装 "Install MongoDB Compass" 不勾选,否则可能要很长时间都一直在执行安装,MongoDB Compass是一个图形界面管理工具,这里不安装也是没有问题的,可以自己去下载一个图形界面管理工具,比如Robo3T
 

之后稍微等待一会就安装好了。

1.4.3 配置MongoDB

MongoDB的安装过程是很简单的,但是配置就比较麻烦了,可能会遇到各种各样的问题,需要你有足够的耐心和仔细。

首先要在MongoDBdata文件夹里新建一个db文件夹和一个log文件夹:

然后在log文件夹下新建一个mongo.log:
 

然后将E:\MongoDB\bin添加到环境变量path中,此时打开cmd窗口运行一下mongo命令,出现如下情况:
 

这是为什么呢?这是因为我们还没有启动MongoDB服务,自然也就连接不上服务了。那要怎么启动呢?在cmd窗口中运行如下命令:

mongod –dbpath E:\MongoDB\data\db

需要注意的是:如果你没有提前创建db文件夹,是无法启动成功的。运行成功之后,我们打开浏览器,输入127.0.0.1:27017,看到如下图,就说明MongoDB服务已经成功启动了。
 

但是如果每次都要这么启动服务的话也太麻烦了吧,这里你可以选择设置成开机自启动,也可以选择用命令net start mongodb来手动启动,这里我选择使用后者,具体方法如下。

还是打开cmd窗口,不过这次是以管理员身份运行,然后输入如下命令:

mongod --dbpath "E:\MongoDB\data\db" --logpath "E:\MongoDB\data\log\mongo.log" -install -serviceName "MongoDB"

如果没有报错的话就说明成功添加到服务里了,可以使用win+R然后输入services.msc命令进行查看:
 

默认是自动运行的,这里我选择把它改成手动的。然后在cmd窗口中运行net start mongodb
 

怎么解决呢?两个步骤:
1)运行sc delete mongodb删除服务;
2)再运行一次配置服务的命令:

mongod --dbpath "E:\MongoDB\data\db" --logpath "E:\MongoDB\data\log\mongo.log" -install -serviceName "MongoDB" 

 然后再运行net start mongodb,服务启动成功:

可能遇到的问题:
1、mongod不是内部或外部命令
出现这种问题说明你没有把bin目录添加到环境变量之中,重新添加一下即可解决。

2、服务名无效
首先是看你输入的服务名称是否有误,然后再查看本地服务中有没有MongoDB服务,如果没有服务,则运行命令添加服务即可。

3、发生服务特定错误:100
删除db文件夹下的mongod.lock和storage.bson两个文件,若删除完之后仍然出现这种问题,用sc delete mongodb删除服务,再配置一下服务就能解决了。

1.4.4 安装一个可视化工具
官网下载 RoBo 3T(Robomongo is now Robo 3T)
下载地址:https://robomongo.org/download

双击安装包安装,修改安装路径,不停下一步,点击安装。
 

打开后,有一个填信息的页面,nameemail,暂时不用管,直接finish
启动MongoDB服务。
点击弹出框中的create,创建新连接,可以修改连接名name,连接IP(下图IP为本地IP),端口(默认)
 

连接成功后,右击localhost,选择create Database,创建数据库
 

创建数据库firstTest,然后右击firstTest,选择open Shell,开始进行shell命令来创建数据库中的集合和文档。
 

 

1.5 Linux安装MongoDB

1.5.1 下载MongoDB

官方下载地址:https://www.mongodb.com/download-center/community

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.1.tgz

 

1.5.2 解压安装

1、解压

tar -zxvf mongodb-linux-x86_64-rhel70-4.2.1.tgz

2、创建目录/usr/local/mongo,并将解压完的mongodb目录移动到/usr/local/mongo

mkdir -p /usr/local/mongo 
mv mongodb-linux-x86_64-rhel70-4.2.1/* /usr/local/mongo/  

3、切到/usr/local/mongo目录下,创建目录

mkdir -p data/db #数据库目录 

mkdir -p logs #日志目录 

mkdir -p conf #配置文件目录

mkdir -p pids #进程描述文件目录

创建好的目录如下:
 

4、在conf目录,增加配置文件mongo.conf

vi /usr/local/mongo/conf/mongo.conf 

 #数据保存路径
dbpath=/usr/local/mongo/data/db/
#日志保存路径
logpath=/usr/local/mongo/logs/mongo.log
#进程描述文件
pidfilepath=/usr/local/mongo/pids/mongo.pid
#日志追加写入
logappend=true
bind_ip_all=true
#mongo默认端口
port=27017
#操作日志容量
oplogSize=10000
#开启子进程
fork=true

5、通过配置文件启动mongo服务端

/usr/local/mongo/bin/mongod -f /usr/local/mongo/conf/mongo.conf 

 启动成功如下:

6、启动mongo客户端

/usr/local/mongo/bin/mongo --host 127.0.0.1 --port 27017

 启动成功如下:

至此安装完成~

1.6 MongoDB基本操作及增删改查

1.6.1 基本操作

登陆数据库

mongo 

查看数据库

show databases;

 

如果切换到一个没有的数据库,例如use admin2,那么会隐式创建这个数据库。(后期当该数据库有数据时,系统自动创建)

use admin2 

查看集合

show collections

 

创建集合

db.createCollection('集合名')

删除集合

`db.集合名.drop()`

 删除数据库
通过use语法选择数据
通过db.dropDataBase()删除数据库

1.6.2 增删改查
1.6.2.1 增加

db.集合名.insert(JSON数据)  

如果集合存在,那么直接插入数据。如果集合不存在,那么会隐式创建。

示例:在test2数据库的c1集合中插入数据(姓名叫webopenfather年龄18岁)

use test2 db.c1.insert({uname:"webopenfather",age:18}) 

 

  • 数据库和集合不存在都隐式创建
  • 对象的键统一不加引号(方便看),但是查看集合数据时系统会自动加
  • mongodb会给每条数据增加一个全球唯一的_id

_id键的组成
 

自己增加_id
可以,只需要给插入的JSON数据增加_id键即可覆盖(但实战强烈不推荐)

db.c1.insert({_id:1, uname:"webopenfather", age:18})

 

一次性插入多条数据
传递数据,数组中写一个个JSON数据即可

db.c1.insert([ {uname:"z3", age:3}, {uname:"z4", age:4}, {uname:"w5", age:5} ]) 

快速插入10条数据
由于mongodb底层使用JS引擎实现的,所以支持部分js语法。因此:可以写for循环

for (var i=1; i<=10; i++) { db.c2.insert({uanme: "a"+i, age: i}) } 

 

查询文档

db.集合名.find(条件[,查询的列])
条件 写法
查询所有的数据 {}或者不写
查询age=6的数据 {age:6}
既要age=6又要性别=男 {age:6,sex:‘男’}
查询的列(可选参数) 写法
查询全部列(字段) 不写
只显示age列(字段) {age:1}
除了age列(字段)都显示 {age:0}

 

其他语法

db.集合名.find({ 
键:{运算符:值} 
}) 
运算符 作用

版权声明:本文为博主作者:z.jiaminf原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/zhangjiaming_zjm/article/details/136241221

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2024年4月22日
下一篇 2024年4月22日

相关推荐