非关系型数据库
MongoDB
新建的默认有两个数据库
admin–配置权限
local–固定的重要数据
一、基本操作
查看数据库
show dbs
创建数据库(隐式创建)
没有成功,需要两步
还可以
查看集合
show tables
show collections
删除库和集合
db.collectionName.drop() // 删除集合
db.dropDatabase() // 删除数据库
库内没有集合了,库也会自动删除
二、增删改查
(一)增:insert方法
MongoDB存储的时文档,文档其实就是json格式的对象。
增加单条数据
增加多条数据
(二)删:remove方法
语法
db.collection.remove(查询表达式, 选项)
选项:
{justOne:true/false},是否只删一行,默认为false
注意:
- 查询表达式依然是个json对象{age:20}
- 查询表达式匹配的行,将被删除
- 如果不写查看表达式,collection中的所有文档 将被删除
例1:删除stu表中 sn属性值为’001’的文档
db.stu.remove({sn:’001’})
例2: 删除stu表中gender属性为m的文档,只删除1行
db.stu.remove({gender:’m’,true});
判断符 | |
name:‘zhangsan’ | 相等 |
$gt:10 | 大于 |
$lt:10 | 小于 |
$gte:10 | 大于等于 |
$lte:10 | 小于等于 |
$ne:10 | 不等于 |
$nin:[1,2] | 不在 |
$in:[1,2] | 在 |
$and:[条件1,条件2] | 并且 |
$or:[条件1,条件2] | 或 |
练习
1.删除name为’tiantian’的数据
2.删除age大于12的数据
3.删除age小于11的数据
4.删除age不等于11的数据
(三)改:update方法
语法
db.collection.update(查询表达式,新值,选项)
注意
如果使用下面语句,不是更新数据,而是更新文档。更新就是用新文档替换旧文档。
$set–修改某列的值
$unset–删除某个列
$rename–重命名某个列
$inc–增加某个列
选项
{upsert:true/false,multi:true/false}
upsert:true/false:默认为false,为true时,不存在则插入,如果存在就更新。
multi:true/false默认为false,为true时,会更新匹配到的所有数据。
(四)查:find方法
语法
db.collection.find(查询表达式,查询的列)
$nin–>not in
_id:只有在指定不显示,才会没有,不写默认都是显示的
其他列,不指定都不显示。
$all–指数组所有单元匹配,就是指指定的内容都要有,通过一个list指定
$exists–是否含有某个列
1–存在
0–不存在
count()–计算查询结果的数量
limit()–查看指定数量的结果
skip()–跳过指定数目
skip()和limit()配合使用可以制作分页。
练习
1.主键为32的商品
2.不属第3栏目的所有商品($ne)
3.本店价格高于3000元的商品{$gt}
4.取出第4栏目或第11栏目的商品($in)
db.goods.find({cat_id:{$in:[4,11]}},{cat_id:1,goods_name:1})
5.取出100<=价格<=500的商品($and)
db.goods.find({$and:[{shop_price:{$gte:100}},{shop_price:{$lte:500}}]},{shop_price:1,goods_name:1})
6.取出不属于第3栏目且不属于第11栏目的商品($and 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})
7.取出价格大于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})
8.取出goods_id%5 == 1, 即,1,6,11,…这样的商品
db.goods.find({goods_id:{$mod:[5,1]}},{goods_id:1,goods_name:1})
三、聚合操作
语法
db.COLLECTION_NAME.aggregate( [ {管道1}, {管道2}, {管道3}, … ] )
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理,管道操作是可以重复的。
常用的管道操作 | |
$project | 修改输入文档的结构。可以用来重命名、增加或修改域,也可以用于创建计算结果以及嵌套文档。 |
$match | 用于过滤数据,只输出符合条件的文档。使用MongoDB的标准查询操作。 |
$limit | 用来限制MongoDB聚合管道返回的文档数。 |
$skip | 在聚合管道中跳过指定数量的文档,并返回余下的文档。 |
$group | 将集合中的文档分组,可用于统计结果。 |
$sort | 将输入文档排序后输出。 |
group中的操作表达式
表达式 | 描述 |
$sum | 计算总和。 |
$avg | 计算平均值 |
$min | 获取集合中所有文档对应值得最小值。 |
$max | 获取集合中所有文档对应值得最大值。 |
$first | 根据资源文档的排序获取第一个文档数据。 |
$last | 根据资源文档的排序获取最后一个文档数据 |
练习
1.查询每个栏目下的商品数量
db.goods.aggregate([{$group:{_id:'$cat_id',total:{$sum:1}}}])
2.查询goods中有多少条商品
db.goods.aggregate([{$group:{_id:null,total:{$sum:1}}}])
或
db.goods.find().count()
3.查询每个栏目下价格大于50元的商品个数
思路:
(1)找出价格大于50元的商品
(2)以cat_id分组,求sum
db.goods.aggregate([{$match:{shop_price:{$gt:50}}},{$group:{_id:'$cat_id',sum:{$sum:1}}}])
4.查询每个栏目下的库存量(商品数量)
db.goods.aggregate([{$group:{_id:"$cat_id",goods_total:{$sum:'$goods_number'}}}])
5.查询每个栏目下,价格大于50的商品个数,并筛选出商品个数大于3的栏目
思路:
(1)查找价格大于50的商品
(2)以cat_id分组,求出每组的商品个数
(3)筛选出商品个数为3的
db.goods.aggregate([{$match:{shop_price:{$gt:50}}},{$group:{_id:'$cat_id',total:{$sum:1}}},{$match:{total:{$gt:3}}}])
6.查询每个栏目的商品平均价格,并按照平均价格由高到低排序
{$sort:{total:1}}:按total这个列排序,1表示升序,-1表示降序
思路:
(1)以cat_id分组,求出组内商品的平均价格
(2)按照平均价格降序排列
db.goods.aggregate([{$group:{_id:"$cat_id",avg_price:{$avg:"$shop_price"}}},{$sort:{avg_price:-1}}])
四、游标
我们查询时使用的db.collectionName.find()方法,会将所有的数据都查询出来。
python中,有生成器,每次给我们返回一条数据,MongoDB中,有游标与它类似。
定义
通俗的说游标不是查询结果,而是查询的返回资源或者接口,就像python中的生成器那样,可以一次一次的获取每一个资源。
声明
var cursor_name = db.collectionName.find()
操作
cursor.hasNext() //判断游标是否已经取到尽头
cursor.next() // 取出游标的下一个单元
cursor.toArray() //看到所有行
cursor.toArray()[2] //看到第二行
注意不要使用toArray()方法,原因是会把所有的行立即以对象的形式放在内存中,这样就失去了使用游标的意义,造成了资源浪费,可以在取出少数的几行时使用。
练习
使用while循环打印游标结果
cursor.forEach()回调函数
var func = function(obj){print(obj.goods_name)}
var cursor = db.goods.find().skip(10).limit(10)
cursor.forEach(func)