文章目录
一、介绍
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象的BSON格式。字段值可以包含其他文档,数组及文档数组。
MongoDB的特点
MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索
引。它是一个面向集合的,模式自由的文档型数据库。
具体特点总结如下:
(1)面向集合存储,易于存储对象类型的数据
(2)模式自由
(3)支持动态查询
(4)支持完全索引,包含内部对象
(5)支持复制和故障恢复
(6)使用高效的二进制数据存储,包括大型对象(如视频等)
(7)自动处理碎片,以支持云计算层次的扩展性
(8)支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++语言的驱动程序
(9) 文件存储格式为 BSON(一种 JSON 的扩展)
MongoDB的体系结构
MongoDB 数据类型
基本数据类型
null: 用于表示空值或者不存在的字段, {“X”:null}
布尔型:
布尔类型有两个值true和false,{“x”:true}
数值:
shell默认使用64为浮点型数值。{“x”:3.14}或{“x”:3}。
浮点型:
对于整型值,可以使用NumberInt(4字节符号整数)或NumberLong(8字节符号整数),{“x”:NumberInt(“3”)}、{“x”:NumberLong(“3”)}
字符串:
UTF-8字符串都可以表示为字符串类型的数据,{“x”:“呵呵”}
日期:
日期被存储为自新纪元依赖经过的毫秒数,不存储时区,{“x”:new Date()}
正则表达式:
查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相同,{“x”: /[abc]/}
数组:
数据列表或数据集可以表示为数组,{“x”: [“a”,“b”,“c”]}
内嵌文档:
文档可以嵌套其他文档,被嵌套的文档作为值来处理,{“x”:{“y”:3 }}
对象Id:
对象id是一个12字节的字符串,是文档的唯一标识(主键),{“x”: objectId() }
二进制数据:
二进制数据是一个任意字节的字符串。它不能直接在shell中使用。如果要将非utf-字符保存到数据库中,二进制数据是唯一的方式。
代码:
查询和文档中可以包括任何JavaScript代码,{“x”:function(){/…/}}
二、安装MongoDB
使用Docker 安装
# 拉取镜像
docker pull mongo:3.6
# 查看镜像
docker images
# 创建容器
docker run --name mongo -v ~/docker/mongo:/data/db -p 27017:27017 -d mongo:3.6
# 查看容器
docker ps
# 进入容器
docker exec -it mongo /bin/bash
修改配置文件,开启远程连接
docker cp mongo:/etc/mongod.conf.orig /data/
将其中的
bindIp: 127.0.0.1
注释掉# bindIp: 127.0.0.1
或者改成bindIp: 0.0.0.0
即可开启远程连接
docker cp /data/mongod.conf.orig mongo:/etc/mongod.conf.orig
使用图形工具连接
三、语法
总结:
集合名称就相当于表名
# 插入
db.集合名称.insert(数据)
#查找全部
db.集合名称.find()
#查询一个
db.集合名称.findOne({userid:'01'})
db.集合名称.find().limit(3)
# 修改文档
db.集合名称.update(条件,修改后数据)
# 删除全部文档
db.集合名称.remove({})
# 删除指定文档
db.集合名称.remove({_id:'1'})
# 统计条数
db.集合名称.count()
# 根据条件统计条数
db.集合名称.count({content:'内容'})
# 模糊查询 MongoDB的模糊查询是通过正则表达式的方式实现的。格式为:/模糊查询字符串/
db.集合名称.find({字段名称:/bug/})
# 匹配content中以‘太’开头的数据
db.集合名称.find({字段名称:/^太/})
# 大于 等于 小于
使用这些需要单独将该值再放入一个{}中
db.集合名称.find({ 字段名称 : { $gt: value }}) // 大于: field > value
db.集合名称.find({ 字段名称 : { $lt: value }}) // 小于: field < value
db.集合名称.find({ 字段名称 : { $gte: value }}) // 大于等于: field >= value
db.集合名称.find({ 字段名称 : { $lte: value }}) // 小于等于: field <= value
db.集合名称.find({ 字段名称 : { $ne: value }}) // 不等于: field != value
//查询id字段在1和2
db.集合名称.find({字段名称:{$in:["1","2"]}})
//查询id字段不在1和2
db.集合名称.find({字段名称:{$nin:["1","2"]}})
//查询访问量大于等于1000 且小于2000的数据
db.集合名称.find({$and:[ {字段名称:{$gte:1000}} ,{字段名称:{$lt:2000} }]})
db.集合名称.find({$or:[ {字段名称:{$gte:1000}} ,{字段名称:{$lt:2000} }]})
//列值增长
db.集合名称.update({字段名称:"2"},{$inc:{visits:NumberInt(2)}})
1.选择和创建数据库
use 数据库名称 # 如果数据库不存在,就自动创建
例如 创建并使用spitdb
use spitdb
2.插入与查询文档
以下命令会自动创建集合,即我们常说的表.
db.集合名称.insert(数据); # 数据格式是BSON格式
db.spit.insert({content:"java是第一编程语言",userid:"1011",nickname:"万能的张三",visits:NumberInt(902)})
查询全部数据:
查询结果中出现_id字段,且数据格式是ObjectID(234123as1234),是MongoDB自动生成,我们也可以指定id插入,但是id字段必须是_id
db.spit.insert({_id:"1",content:"有个bug求解决",userid:"1012",nickname:"张三",visits:NumberInt(2020)});
db.spit.insert({_id:"2",content:"分析面试经验",userid:"1013",nickname:"李四",visits:NumberInt(1023)});
db.spit.insert({_id:"3",content:"想拿高薪私聊我",userid:"1013",nickname:"王五",visits:NumberInt(111)});
db.spit.insert({_id:"4",content:"嘿嘿嘿",userid:"1014",nickname:"赵六",visits:NumberInt(1223)});
db.spit.insert({_id:"5",content:"我太难了",userid:"1016",nickname:"周期",visits:NumberInt(1255)});
3.按条件查询
//查询全部
db.spit.find()
//根据id查询 条件是bson格式
db.spit.find({_id:'1'})
//如果有多条记录返回,使用findOne命令只返回一条
db.spit.findOne({_id:'1'})
4.返回指定条数数据
5.修改文档
db.spit.find({_id:'1'})
注意 这样修改后就只省这一个字段了。
使用$set 修改指定字段 ,注意后面冒号:
db.spit.update({_id:'1'},{$set:{visits:NumberInt(20000)}})
6.删除文档
//删除文档
db.spit.remove({_id:'11'})
7.统计条数
//统计条数
db.spit.count()
db.spit.count({visits:902})
8.模糊查询
//模糊查询
db.spit.find({content:/bug/})
db.spit.find({content:/^j/})
9.大于小于、and、or、in、nin、inc
//访问量大于1000
db.spit.find({visits:{$gt:1000}})
//访问量小于1000
db.spit.find({visits:{$lt:1000}})
//访问量大于等于1000
db.spit.find({visits:{$gte:902}})
//访问量小于等于1000
db.spit.find({visits:{$lte:902}})
//访问量不等于1000
db.spit.find({visits:{$ne:902}})
//访问量等于1000
db.spit.find({visits:{$eq:902}})
//查询id字段在1和2
db.spit.find({_id:{$in:["1","2"]}})
//查询id字段不在1和2
db.spit.find({_id:{$nin:["1","2"]}})
//查询访问量大于等于1000 且小于2000的数据
db.spit.find({$and:[ {visits:{$gte:1000}} ,{visits:{$lt:2000} }]})
db.spit.find({$or:[ {visits:{$gte:1000}} ,{visits:{$lt:2000} }]})
//列值增长
db.spit.update({_id:"2"},{$inc:{visits:NumberInt(2)}})