MongoDB
将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
基本概念
- 库: 存储数据的仓库
- 集合: 若干文档组成集合
- 文档: 一个文档代表一条数据
语句使用
注:区分大小写
库
// 查看所有“数据库”,没有数据的库看不到(MongoDB并没有真正创建这个库)
show databases;
show dbs;
// 切换数据库(没有则创建)
use mydb1;
// 查看当前连接的数据库
db;
//删库
db.dorpDatabase('mydb1');
集合
use mydb1;
// 查看数据库下的所有集合
show collections;
// 建集合
db.createCollection('product')
// 删集合
db.集合名.drop();
文档
增
注:向一个不存在的集合插入数据,则会自动创建这个集合
语法: db.集合名.insert(文档)
use mydb1;
db.product.insert({name:'龙的传人',item:'电影票',sotcks:52,price:25});
db.product.insert({name:'金刚',item:'电影票',stocks:99,price:30,
dates:['2022-9-1','2022-9-2','2022-9-3'],
addr:{city:'成都',name:'万达电影城'}});
// 插入多个文档
db.customer.insert([
{name:'张三',age:20},
{name:'李四',sex:'男',age:25},
{name:'王五',sex:'男',fruits:['西瓜','李子','苹果']}
]);
//可指定_id值,但不能重复
db.customer.insert({_id:'0001',name:'小李',age:23});
查
语法: db.集合名.find({条件文档})
- 常用条件
use mydb1;
// 查询product下所有文档
db.product.find();
// 查询满足条件的数据
db.product.find({item:'电影票',name:'金刚'});
// 等于$eq、不等$ne、大于$gt、大于等于$gte、小于$lt、小于等于$lte
// 查询name不为金刚的数据
db.product.find({name:{$ne:'金刚'}});
// 并且$and、或者$or、否$not
// 查询stocks大于60或price小于25的数据
db.product.find({$or:[{stocks:{$gt:60}},{price:{$lt:25}}]});
# $not
db.product.find({item:{$not:{$eq:"电影票"}}});
// 在$in、不在$nin
// 查询price不是10,30的数据
db.product.find({price:{$nin:[10,30]}});
- 条件字段是数组
// 完全匹配
db.product.find({dates:["2022-9-1","2022-9-2","2022-9-3"]});
// 包含一个元素,日期中含有2022-9-2的数据
db.product.find({dates:"2022-9-2"});
// 包含多个元素 $all
db.product.find({dates:{$all:["2022-9-2","2022-9-3"]}});
// 数组元素个数 $size
db.product.find({dates:{$size:3}});
// 数组字段名.索引编号 0开始
// dates中第二个元素是2022-9-2的数据
db.product.find({"dates.1":"2022-9-2"})
- 条件字段是文档
// 完全匹配
db.product.find({addr:{city:"成都",name:"万达电影城"}})
// 文档字段.子字段
db.prodcut.find({"addr.city":{$ne:"成都"},"addr.name":"万达电影城"})
指定显示字段:db.集合名.find({条件},{字段:1或0})
注:_id默认显示,除_id:0外,其它字段不能将0和1混用
// 只显示name、price、stocks字段
db.product.find(
{itme:"电影票"}, #条件
{name:1,price:1,stocks:1,_id:0} #指定字段
);
// 除price、stocks外都显示
db.product.find({},{price:0,stocks:0});
排序:db.集合名.find({条件}).sort({字段:1或-1})
// 按价格升序排
db.product.find().sort({price:1});
// 先价格降序,再库存升序
db.product.find().sort({price:-1,stocks:1});
db.product.find({"addr.ctiy":"成都"},{name:1,addr:1,stocks:1}).sort({stocks:-1});
限制数据数量:db.集合名.find({条件}).limit()
// 显示2条数据
db.product.find().limit(2)
跳过指定数量的数据: db.集合名.find({条件}).skip()
// 显示第6条数据
db.product.find().limit(1).skip(5);
聚合:db.集合名.aggregate()
注:_id是必需的(非文档_id),null表示为全部。_id的值用于分组
$sum、$avg、$min、$max
$push
:将值加入一个数组中,不会判断是否有重复
$addToSet
:值加入一个数组中,会判断是否有重复,有则不加入
$first
:根据排序获取第一个文档数据
$last
:根据排序获取最后一个文档数据
// 统计每个价格都有多少部电影
// 可理解为select price,count(*) from product group by price
db.product.aggregate([{$group:{_id:"$price",count_num:{$sum:1}}}]);
// $push 将所有价格加到数组中
db.product.aggregate([{$group:{_id:"name",price:{$push:"$price"}}}])
// $match 将满足stocks大于50小于90的数据交给下个$group处理
db.product.aggregate([
{$match:{stocks:{$gt:50,$lt:90}}},
{$group:{_id:null,first_date:{$first:"$date"}}}
]);
计数:db.集合名.find({条件}).count()
// 票已售空的电影数量
db.product.find({stocks:0}).count();
去重::db.集合名.distinct(字段)
// 查看都有哪些不同的票价
db.product.distinct("price");
改
语法:
- 修改一个文档
db.集合名.update({条件},{修改内容})
- 修改多个文档
db.集合名.updateMany({条件},{修改内容})
use mydb1;
// 增加字段 {$set:{字段名:值}}、{$push:{数组字段名:新元素}}
db.product.updateOne({name:'金刚'},{$set:{other:'very good!'}});
db.product.updateMany({item:'电影票'},{$push:{money:1800}});
// 删除字段 {$unset:{字段名:1}}
db.product.updateMany({},{$unset:{money:1}});
// {$inc:{字段名:改变值}}
db.product.updateOne({name:'金刚'},{$inc:{price:10}}); //票价加10
db.product.updateMany({item:'电影票'},{$inc:{price:-5}}); //票价减5
删
语法:
- 删除一个文档
db.集合名.deleteOne({条件})
- 删除多个文档
db.集合名.deleteMany({条件})
use mydb1;
// 删一个文档
db.product.deleteOne({name:'金刚'});
// 删集合下所有文档(集合仍在)
db.product.deleteMany({});
// 删集合下满足条件的所有文档
db.product.deleteMany({item:'电影票'});