一、三个概念
数据库(database)
- 数据库是一个仓库,在仓库中可以存放集合。
集合(collection)
- 集合类似于数组,在集合中可以存放文档。
- 集合就是一组文档,也就是集合是用来存放文档的
- 集合中存储的文档可以是各种各样的,没有格式要求
文档(document)
- 文档数据库中的最小单位,我们存储和操作的内容都是文档。
- 类似于JS中的对象,在MongoDB中每一条数据都是一个文档
多个文档组成集合,多个集合组成数据库
二、基本指令
show dbs / show databases:显示当前的所有数据库
use 数据库名:进入到指定的数据库中
db:表示的是当前所处的数据库
show collections:显示数据库中所有的集合
常用操作:
use 数据库名
– 使用use时,如果数据库存在则会进入到相应的数据库,如果不存在则会自动创建
– 一旦进入数据库,则可以使用db来引用当前库
db.collection.insert(文档)
– 向集合中插入文档,如果集合不存在则创建
db.createCollection()
– 创建一个新的集合
db.collection.drop()
– 删除集合
在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合。
三、数据库的CRUD(增删改查)的操作
1、插入操作
db.<collection>.insert() 向集合中插入一个或多个文档
db.<collection>.insertOne() 插入一个文档对象
db.<collection>.insertMany() 插入多个文档对象
- insert()可以用于向集合中添加一个或多个文档,可以传递一个对象,或一个数组。
- 添加时如果集合或数据库不存在,会自动创建
- 当我们向集合中插入文档时,如果没有给文档指定 _id 属性,则数据库会自动为文档添加_id,该属性用来作为文档的唯一标识(根据时间戳生成)
- _id 可以自己指定,如果我们指定了数据库就不会在添加了,但是自己指定 _id 也必须确保它的唯一性
示例:
向test数据库中的,stus集合中插入一个新的学生对象
db.stus.insert({name:"孙悟空",age:18,gender:"男"})
批量插入对象
db.stus.insert([
{name:"猪八戒", age:26, gender:"男"},
{name:"师傅", age:20, gender:"男"},
{name:"沙和尚", age:28, gender:"男"}
]);
2、查询操作
db.collection.find()
可以接受一个对象作为条件参数,用来查询集合中符合条件的文档
查询集合中所有的文档,会返回一个文档数组
db.collection.findOne()
用来查询符合条件的第一个文档,返回一个文档对象
db.collection.find().count()
查询所有结果的数量
示例:
db.stus.find({属性名: 值});
db.stus.find({age: 28, name: "孙悟空"});
db.collection.find().count();
3、更新操作
db.collection.update()
- 参数1:查询条件,查询文档
- 参数2:新的文档,这样符和条件的文档将会被新文档
- 注意:默认情况下会使用新对象替换旧对象,如果需要修改指定的属性,而不是全部替换,需要使用"修改操作符"来完成修改
- update()的第三个参数,用来指定是否使用upsert,默认为false
– update()的第四个参数,用来指定是否同时修改多个文档,默认为false
修改器:
使用update会将整个文档替换,但是大部分情况下我们是不需要这么做的
如果只需要对文档中的一部分进行更新时,可以使用更新修改器来进行
$set 可以用来修改文档中的属性
$unset 可以用来删除文档的指定属性
db.collection.updateMany():同时修改多个符号条件的文档
db.collection.updateOne():修改一个符合条件的文档
示例:
db.stus.update({name:"沙和尚"}, {age:28}); 会把新对象覆盖为旧对象
db.stus.update(
{"_id": ObjectId("621f0ce8eddb4d8043b631ec")},
{$set: {
name: "沙和尚1",
age: "38"
}
}
);
update 默认修改一个,使用 multi=true 支持修改多个:
multi属性:可选的。如果设置为true,则更新满足query条件的多个文档。如果设置为false,则更新一个文档。默认值为false
4、删除操作
db.collection.remove()
- 删除一个或多个符合条件的文档(默认情况下会删除多个),必须有条件参数
- 如果只传递一个{}空对象,会清空集合,但性能较差
- {条件对象} 可以根据条件来删除文档,传递的条件的方式和 find() 一样
- 如果 remove() 第二个参数使用 justOne=true,则只会删除一个
db.collection.deleteOne()删除一个符合条件的文档
db.collection.deleteMany():删除多个符合条件的文档
db.collection.remove({}) 情况集合(性能差)
db.collection.drop(): 清空集合
db.dropDatabase():删除数据库
remove() 只删除一个:
示例:
db.collection.remove({age: 28}, true);
四、其他操作
1、排序
//查询文档时,默认情况是按照 _id 的进行排序(升序)
db.emp.find();
//sort() 可以用来指定文档的排序的规则,
//需要传递一个对象来指定排序规则,1 表示升序,-1表示降序
//limit skip sort 可以任意的顺序进行调用
db.emp.find().sort({sal:-1});
db.emp.find().sort({sal:1, empno: -1});
2、投影
//在查询时,可以在第二个参数位置设置查询结果的投影
//显示哪些字段,1表示显示,0表示不显示
db.emp.find({}, {ename:1, _id:0, sal:1});
五、练习一:
//1.进入my_test数据
use my_test
show dbs
//2.向数据库的user集合中插入一个文档
db.users.insert({
username: "孙悟空"
});
//3.查询user集合中的文档
db.users.find();
//4.向数据库的user集合中插入一个文档
db.users.insert({
username: "猪八戒"
});
//5.查询数据库user集合中的文档
db.users.find();
//6.统计数据库user集合中的文档数量
db.users.find().count();
//7.查询数据库user集合中username为sunwukong的文档
db.users.find({
username: "孙悟空"
});
//8.向数据库user集合中的username为sunwukong的文档,添加一个address属性,属性值为huaguoshan
db.users.update(
{username:"孙悟空"},
{$set: {
address: "huaguoshan"
}}
);
//9.使用{username:"tangseng"} 替换 username 为 zhubajie的文档
db.users.update(
{username:"猪八戒"},
{username:"tangseng"}
);
//10.删除username为sunwukong的文档的address属性
db.users.update(
{username: "孙悟空"},
{$unset: {
address:""
}}
);
//11.向username为sunwukong的文档中,添加一个hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}
//MongoDB 的文档的属性值也可以是文档,当一个文档的属性值是一个文档时,我们称这个文档叫做 内嵌文档
db.users.update(
{username: "孙悟空"},
{$set:{hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}}}
);
//12.向username为tangseng的文档中,添加一个hobby:{movies:["A Chinese Odyssey","King of comedy"]}
db.users.update(
{username: "tangseng"},
{$set: {hobby:{movies:["A Chinese Odyssey","King of comedy"]}}}
);
//13.查询喜欢电影hero的文档
//MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询的内嵌文档则可以通过. 的形式来匹配
//如果要通过内嵌文档对文档进行查询,属性名必须使用引号
db.users.find({"hobby.movies":"hero"});
//14.向tangseng中添加一个新的电影Interstellar
//$push 用于向数组中添加一个新的元素
//$addToSet 向数组中添加一个新元素,如果数组中已经存在了该元素,则不会添加
db.users.update(
{username: "tangseng"},
{$push: {"hobby.movies": "Interstellar"}}
);
db.users.update(
{username: "tangseng"},
{$addToSet: {"hobby.movies": "Interstellar"}}
);
//15.删除喜欢beijing的用户
db.users.remove(
{"hobby.cities": "beijing"}
);
//16.删除user集合
db.users.remove({});
db.users.drop();
db.users.find();
show dbs;
//17.向numbers中插入20000条数据
use numbers;
//耗时,效率低
for (var i = 1; i <= 20000; i++){
db.numbers.insert({num:i});
}
db.numbers.remove({});
db.numbers.find().count();
//高效
var arr = [];
for (var i = 1; i <= 20000; i++){
arr.push({num:i});
}
db.numbers.insert(arr);
六、练习二:
use numbers;
//18.查询numbers中num为500的文档
db.numbers.find(
{num: 500}
);
db.numbers.find(
{num: {$eq: 5000}}
);
//19.查询numbers中num大于5000的文档
db.numbers.find(
{num: {$gt: 5000}}
);
//20.查询numbers中num小于30的文档
db.numbers.find(
{num: {$lt: 30}}
);
//21.查询numbers中num大于40小于50的文档
db.numbers.find(
{num: {$gt: 40, $lt: 50}}
);
//22.查询numbers中num大于19996的文档
db.numbers.find(
{num: {$gt: 1996}}
);
//23.查看numbers集合中的前10条数据
//limit() 设置显示数据的上限
db.numbers.find().limit(10);
//24.查看numbers集合中的第11条到20条数据
//skip() 用于跳过指定数量的数据
db.numbers.find().skip(10).limit(10);
//25.查看numbers集合中的第21条到30条数据
// skip((页码-1) * 每页显示的条数).limit(每页显示的条数);
db.numbers.find().skip(20).limit(10);
//MongoDB会自动调整 limit与 skip 的位置
db.numbers.find().limit(10).skip(20);
七、文档之间的关系
-
一对一(one to one)
- 在MongoDB 可以通过内嵌文档的形式来体现出一对一的关系
-
一对多(one to many)/多对一(many to one)
-
多对多(many to many)
八、测试三:
准备文件:
dept.json
{
"_id" : ObjectId("5941f2bac1bc86928f4de49a"),
"deptno" : 10.0,
"dname" : "财务部",
"loc" : "北京"
}
{
"_id" : ObjectId("5941f2bac1bc86928f4de49b"),
"deptno" : 20.0,
"dname" : "办公室",
"loc" : "上海"
}
{
"_id" : ObjectId("5941f2bac1bc86928f4de49c"),
"deptno" : 30.0,
"dname" : "销售部",
"loc" : "广州"
}
{
"_id" : ObjectId("5941f2bac1bc86928f4de49d"),
"deptno" : 40.0,
"dname" : "运营部",
"loc" : "深圳"
}
emp.json
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4ac"),
"empno" : 7369.0,
"ename" : "林冲",
"job" : "职员",
"mgr" : 7902.0,
"hiredate" : ISODate("1980-12-16T16:00:00Z"),
"sal" : 800.0,
"depno" : 20.0
}
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4ad"),
"empno" : 7499.0,
"ename" : "孙二娘",
"job" : "销售",
"mgr" : 7698.0,
"hiredate" : ISODate("1981-02-19T16:00:00Z"),
"sal" : 1600.0,
"comm" : 300.0,
"depno" : 30.0
}
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4ae"),
"empno" : 7521.0,
"ename" : "扈三娘",
"job" : "销售",
"mgr" : 7698.0,
"hiredate" : ISODate("1981-02-21T16:00:00Z"),
"sal" : 1250.0,
"comm" : 500.0,
"depno" : 30.0
}
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4af"),
"empno" : 7566.0,
"ename" : "卢俊义",
"job" : "经理",
"mgr" : 7839.0,
"hiredate" : ISODate("1981-04-01T16:00:00Z"),
"sal" : 2975.0,
"depno" : 20.0
}
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4b0"),
"empno" : 7654.0,
"ename" : "潘金莲",
"job" : "销售",
"mgr" : 7698.0,
"hiredate" : ISODate("1981-09-27T16:00:00Z"),
"sal" : 1250.0,
"comm" : 1400.0,
"depno" : 30.0
}
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4b1"),
"empno" : 7698.0,
"ename" : "西门庆",
"job" : "经理",
"mgr" : 7839.0,
"hiredate" : ISODate("1981-04-30T16:00:00Z"),
"sal" : 2850.0,
"depno" : 30.0
}
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4b2"),
"empno" : 7782.0,
"ename" : "柴进",
"job" : "经理",
"mgr" : 7839.0,
"hiredate" : ISODate("1981-06-08T16:00:00Z"),
"sal" : 2450.0,
"depno" : 10.0
}
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4b3"),
"empno" : 7788.0,
"ename" : "公孙胜",
"job" : "分析师",
"mgr" : 7566.0,
"hiredate" : ISODate("1987-07-12T16:00:00Z"),
"sal" : 3000.0,
"depno" : 20.0
}
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4b4"),
"empno" : 7839.0,
"ename" : "宋江",
"job" : "董事长",
"hiredate" : ISODate("1981-11-16T16:00:00Z"),
"sal" : 5000.0,
"depno" : 10.0
}
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4b5"),
"empno" : 7844.0,
"ename" : "阎婆惜",
"job" : "销售",
"mgr" : 7698.0,
"hiredate" : ISODate("1981-09-07T16:00:00Z"),
"sal" : 1500.0,
"comm" : 0.0,
"depno" : 30.0
}
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4b6"),
"empno" : 7876.0,
"ename" : "李逵",
"job" : "职员",
"mgr" : 7902.0,
"hiredate" : ISODate("1987-07-12T16:00:00Z"),
"sal" : 1100.0,
"depno" : 20.0
}
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4b7"),
"empno" : 7900.0,
"ename" : "武松",
"job" : "职员",
"mgr" : 7782.0,
"hiredate" : ISODate("1981-12-02T16:00:00Z"),
"sal" : 950.0,
"depno" : 10.0
}
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4b8"),
"empno" : 7902.0,
"ename" : "吴用",
"job" : "分析师",
"mgr" : 7566.0,
"hiredate" : ISODate("1981-12-02T16:00:00Z"),
"sal" : 3000.0,
"depno" : 20.0
}
{
"_id" : ObjectId("5941f5bfc1bc86928f4de4b9"),
"empno" : 7934.0,
"ename" : "鲁智深",
"job" : "职员",
"mgr" : 7782.0,
"hiredate" : ISODate("1982-01-22T16:00:00Z"),
"sal" : 1300.0,
"depno" : 10.0
}
测试:
//26.将dept和emp集合导入到数据库中
//27.查询工资小于2000的员工
db.emp.find(
{sal: {$lt: 2000}}
);
//28.查询工资在1000-2000之间的员工
db.emp.find(
{sal: {$lt: 2000, $gt: 1000}}
);
//29.查询工资小于1000或大于2500的员工
db.emp.find(
{$or: [{sal:{$lt: 1000}}, {sal: {$gt: 2500}}]}
);
//30.查询财务部的所有员工
var deptNo = db.dept.findOne({dname:"财务部"}).deptno;
db.emp.find({depno: deptNo});
//31.查询销售部的所有员工
var deptNo = db.dept.findOne({dname:"销售部"}).deptno;
db.emp.find({depno: deptNo});
//32.查询所有mgr为7698的所有员工
db.emp.find({mgr: 7698});
//33.为所有薪资低于1000的员工增加工资400元
db.emp.find(
{sal: {$lt: 1000}}
);
//$inc用来增加已有键的值,或者该键不存在那就创建一个
//$inc只能用于Number类型的值
db.emp.updateMany(
{sal: {$lte: 1000}},
{$inc:{sal: 400}}
);
db.emp.find();
db.dept.find();
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
2021-03-06 Java 常用类——String类
2021-03-06 第四节:职责链模式——总结
2021-03-06 第三节:职责链模式——在SpringMVC源码分析
2021-03-06 第二节:职责链模式——基本介绍&应用
2021-03-06 第一节:职责链模式——需求说明&传统实现
2020-03-06 URI、URL 和 URN 的区别