这里写自定义目录标题
MongoDB基本介绍
- 简单介绍
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 - 业务应用场景
MongoDB可应对“三高“需求
High performance:对数据库高并发读写的需求
Huge Storage:对海量数据的高效率存储和访问的需求
High Scalability && High Availability:对数据库的高可扩展性和高可用性的需求 - 什么时候选择MongoDB
应用不需要事务及复杂join支持
新应用,需求会变,数据模型无法确定,想快速迭代开发
应用需要2000-3000以上的读写QPS(更高也可以)
应用需要TB甚至PB级别数据存储
应用要求存储的数据不丢失
应用需要99.999%高可用
应用需要大量的地理位置查询、文本查 - 体系机构
- 数据类型
MongoDB的最小存储单位就是文档document对象。文档document对象对应于关系型数据库的行。数据在MongoDB中以BSON(Binary-JSON)文档的格式存储在磁盘上。
BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称 Binary JSON;BSON和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和Bin Data类型。
BSON中,除了基本JSON类型: string,integer,boolean,double,null,array和object,mongo还使用了特殊的数据类型。这些类型包括 date, object id, binary data, regular expression和code。每一个驱动都以特定语言的方式实现了这些类型,查看你的驱动的文档来获取详细信息
MongoDB基本操作
数据库相关
1、查看数据库
show databases;
2、创建或切换数据库
use 数据库名
选择数据库(如果数据库不存在,不会报错;会隐式创建:当后期该数据库有数据时自动创建)
3、删除数据库(先选中数据库)
db.dropDatabase()
集合相关
1、查看所有集合
show collections
2、创建集合(插入数据会隐式创建)
db.createCollection('集合名')
3、删除集合
db.集合名.drop()
增删改查
- 增
db.集合名.insert(JSON数据)
use test2 db.c1.insert({uname:"webopenfather",age:18}) ----在test2数据库的c1集合中插入数据(姓名叫webopenfather年龄18岁)
mongodb会给每条数据增加一个全球唯一的_id键
一次性插入多条数据
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.集合名.remove(条件[,是否删除一条]) ---默认是false
是否删除一条
true:是(删除的数据为第一条)
db.c3.remove({uname:"zs3"},true) ---删除uname:"zs3"的第一条
db.c3.remove({uname:"zs3"}) --删除uname:"zs3"的所有
- 修改文档
db.集合名.update(条件,新数据[是否新增,是否修改多条,])
新数据是否需要使用修改器,如果不使用,那么会将新数据替换原来的数据。
1db.集合名.update(条件,{修改器:{键:值}}[是否新增,是否修改多条,])
修改器 作用
$inc 递增
$rename 重命名列
$set 修改列值
$unset 删除列
是否新增
指条件匹配不到数据则插入(true是插入,false否不插入默认)
是否修改多条
指将匹配成功的数据都修改(true是,false否默认)
db.c3.update({uname:"zs1"},{$set:{uname:"zs2"}}) ----查找不到,不做修改
db.c3.update({uname:"zs1"},{$set:{uname:"zs2"}},true) ----查找不到,则插入
db.c3.update({uname:"zs10"},{$inc:{age:2}}) ---给{uname:"zs10"}的年龄加2岁
----修改gcc的username为bareth,age+11,sex字段重命名为sexuality,删除address字段
db.people.update({username:"gcc"},{
$set:{username:"bareth"},
$inc:{age:11},
$rename:{sex:"sexuality"},
$unset:{address:true}
})
- 查询文档
db.集合名.find(条件[,查询的列])
其他语法
db.集合名.find({
键:{运算符:值}
})
----查询所有数据
db.c1.find()
---只看uname列
db.c1.find({},{uname:1})
---除了uname列都看
db.c1.find({},{uname:0})
-----查询age大于5的数据
db.c1.find({age:{$gt:5}})
----查询年龄是5岁、8岁、10岁的数据
db.c2.find({age:{$in:[5,8,10]}})
----查询年龄不是null的数据
db.c2.find({ age: { $ne: null } })
----查询年龄一定存在且不是null的数据
db.c2.find({ age: { $exists: true, $ne: null } })
1:主键为32的商品
db.goods.find({goods_id:32});
2:不属第3栏目的所有商品($ne)
db.goods.find({cat_id:{$ne:3}},{goods_id:1,cat_id:1,goods_name:1});
3:本店价格高于3000元的商品{$gt}
db.goods.find({shop_price:{$gt:3000}},{goods_name:1,shop_price:1});
4:本店价格低于或等于100元的商品($lte)
db.goods.find({shop_price:{$lte:100}},{goods_name:1,shop_price:1});
5:取出第4栏目或第11栏目的商品($in)
db.goods.find({cat_id:{$in:[4,11]}},{goods_name:1,shop_price:1});
6:取出100<=价格<=500的商品($and)
db.goods.find({$and:[{price:{$gt:100},{$price:{$lt:500}}}]);
7:取出不属于第3栏目且不属于第11栏目的商品($and $nin和$nor分别实现)
db.goods.find({$and:[{cat_id:{$ne:3}},{cat_id:{$ne:11}}]},{goods_name:1,cat_id:1})
db.goods.find({cat_id:{$nin:[3,11]}},{goods_name:1,cat_id:1});
db.goods.find({$nor:[{cat_id:3},{cat_id:11}]},{goods_name:1,cat_id:1});
8:取出价格大于100且小于300,或者大于4000且小于5000的商品()
db.goods.find({$or:[{$and:[{shop_price:{$gt:100}},{shop_price:{$lt:300}}]},{$and:[{shop_price:{$gt:4000}},{shop_price:{$lt:5000}}]}]},{goods_name:1,shop_price:1});
9:取出goods_id%5 == 1, 即,1,6,11,..这样的商品
db.goods.find({goods_id:{$mod:[5,1]}});
10:取出有age属性的文档
db.stu.find({age:{$exists:1}});
# 含有age属性的文档将会被查出