⭐ 简介:大家好,我是zy阿二,我是一名对知识充满渴望的自由职业者。
☘️ 最近我沉溺于Python的学习中。你所看到的是我的学习笔记。
❤️ 如果对你有帮助,请关注我,让我们共同进步。有不足之处请留言指正!
系列文章传送门,建议循序渐进的学习:
1. MongoDB入门安装 & 用Pycharm可视化链接MongoDB。入门篇
2. 用Pycharm熟悉Mongodb命令,增删改查基本操作。基础篇【本文】
3. 用pymongo库实现Python对MongoDB的深度操作。毕业篇
在阅读本文前,请先确保您已经开启Mongdb服务并链接了Pycharm可视化。Mongdb安装和Pycharm可视化操作教程
✅ Mongodb基本命令
CMD命令 | 注释 |
---|---|
mongod --install --dbpath 数据目录 --logpath 日志目录\日志名称.log | 创建 MongoDB服务 |
mongodb | 处理MongoDB的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。当我们运行mongod命令意味着正在启动MongoDB进程,并且在后台运行。 |
net start mongodb | 启动 MongoDB服务 |
sc delete mongodb | 删除 MongoDB服务 |
mongod --remove | 卸载 MongoDB服务 |
net stop mongodb | 关闭 MongoDB服务 |
✅ 更多Mongodb命令。先准备工作:
由于Mongodb的命令都需要在mongo.exe下运行。 无法ctrl+c 、 ctrl+v 所以。。。来手打吧??兄弟人生苦短!!
如图,用Pycharm 可视化链接MongoDB后就可以用控制台舒适的执行MongoDB的命令了。
不会如何使用Pycharm链接MongoDB的请去看我上一篇文章
1. 创建、写入
1. 1 insertOne() 方法,一次写入一行数据。
// 选择数据库。如果数据库不存在,不会报错;会隐式创建,即当有数据时自动创建(
use data
// insertOne,写入数据命令。 不用先创建集合(表),插入数据时会先判断集合是否存在,如果存在就直接写入并保存。如果不存在,则会先创建,再写入并保存。
db.testcoll.insertOne({ _id: 1, user_id: "张三", age: 11, score: 90}) // 插入一行数据
db.testcoll.insertOne({ _id: 2, user_id: "李四", age: 12, score: 95}) // 再插入一行数据
db.testcoll.find(); //查询 testcoll 集合中的数据
1. 2 insertMany([ ]) 方法,一次写入多行数据。
// insertMany([ ]),一次写入多行数据命令。 格式如下:
// 不用先创建集合(表),插入数据时会先判断集合是否存在,如果存在就直接写入并保存。如果不存在,则会先创建,再写入并保存。
db.testcoll.insertMany([
{ _id: 1, user_id: "张三", age: 11, score: 90},
{ _id: 2, user_id: "李四", age: 12, score: 95}]) // 一次插入多行数据
2. 查询
2.1 查询全部。
db.testcoll.find({});
// 查询 testcoll中所有的数据
2.2 查询指定一列 或 多列
db.testcoll.find({},{age:1,user_id:1});
// 第一个{},不能去掉,写筛选条件的,没有就留空
// 没有筛选条件为空,显示age和user_id这两列
// 1代表显示。0代表不显示。但是 _id默认是显示的。
db.testcoll.find({},{age:1,user_id:1,_id:0});
// 当不想要显示_id的时,设_id:0
2.2 查询满足条件的行
db.testcoll.find({age:11})
// 设置条件,返回结果。返回age = 11 的行
// 注意! 我这里只写了一个{}
2.3 运算符查询满足条件的行。
db.testcoll.find({age: {$gt: 10}})
// 设置条件,返回 age > 10 的数据
运算符
运算符 | 作用 |
---|---|
: | (冒号)等于 |
$lt | 小于 |
$lte | 小于等于 |
$gt | 大于 |
$gte | 大于等于 |
$ne | 不等于 |
$in | 包含 |
$nin | 不包含 |
2.4 多条件查询,and
db.testcoll.find( {age: {$gt: 10},score: {$ne: 90} } )
// 多条件筛选,age > 10 并且 score 不等于 90的
2.4 多条件查询,or
db.testcoll.find( { $or:[ {age: {$gt: 10}, score: {$lt: 100} } ] } )
// 满足多个条件其中一个的格式。查询 age > 10 或者 score < 100的
2.4 查询按排序输出
db.testcoll.find({}).sort( { user_id: -1 })
// sort()方法是在 find()方法之外的。 -1表示降序,1表示升序。
2.4 查询满足条件的数据,返回指定的数据
db.testcoll.find({user_id: '张三'}, {score: 1,_id:0})
// 查询条件:user_id = 张三,返回结果 score的vlaue
2.7 查询指定索引
db.testcoll.findOne()
或者
db.testcoll.find().limit(1)
findOne() 每次只能获取一条数据,如果获取多条就需要使用下面这个语句了。
db.testcoll.find().limit(3).skip(5)
//从索引为3开始获取5条数据
2.5查询总数
db.testcoll.count()
//或者
db.testcoll.find().count()
//指定key查询。 $exists: true = 存在
db.testcoll.count( { age: { $exists: true } } )
//或者
db.testcoll.find( { age: { $exists: true } } ).count()
2.6 查询嵌套的数据
看下面这组新的数据,在score
中嵌套了一个dict,此时我们需要查询王五
的英语成绩
。
//在嵌套的字段里查询则需要用点 . 来连接。 如score.语文
db.testcoll.insertMany( [
{ name: "张三", age: 10, score: { "语文": 77, "英语": 37, "数学": 75 }, side: "一班" },
{ name: "李四", age: 11, score: { "语文": 55, "英语": 10, "数学": 72 }, side: "二班" },
{ name: "王五", age: 12, score: { "语文": 60, "英语": 50, "数学": 52 }, side: "一班" },
{ name: "赵六", age: 13, score: { "语文": 65, "英语": 20, "数学": 35 }, side: "二班" },
{ name: "周七", age: 14, score: { "语文": 70, "英语": 66, "数学": 37 }, side: "三班" }
]);
db.testcoll.find( { name:"王五"},{"score.英语": 1} )
// 第一个{}是条件,第二个{}通过.来链接score中的英语。 :1 就是显示。
2.7 $group分组查询
返回所有指定的不重复的字段
db.testcoll.insertMany( [
{ name: "张三", age: 10, score: { "语文": 77, "英语": 37, "数学": 75 }, side: "一班" },
{ name: "李四", age: 11, score: { "语文": 55, "英语": 10, "数学": 72 }, side: "二班" },
{ name: "王五", age: 12, score: { "语文": 60, "英语": 50, "数学": 52 }, side: "一班" },
{ name: "赵六", age: 13, score: { "语文": 65, "英语": 20, "数学": 35 }, side: "二班" },
{ name: "周七", age: 14, score: { "语文": 70, "英语": 66, "数学": 37 }, side: "三班" }
]);
// 返回所有side不重复的字段
db.testcoll.aggregate( [ { $group : { _id : "$side" } } ] )
2.8 sort({}) 排序查询、limit() 限制最大行
// 查询时按age降序返回结果。 -1 是降序, 1是升序
db.testcoll.find({}, {}).sort({age: -1})
// 查询时优先按_id降序遇到相同结果时再按age升序。同时限制最大返回3行
db.testcoll.find({}, {}).sort({_id: -1, age: 1}).limit(3)
3. 删除
// 删除集合下所有的文档;
db.testcoll.deleteMany ({})
//删除 age 等于 10 的全部文档;
db.testcoll.deleteMany ({age: 10})
//删除 age 等于 10 并且 name = "周七" 的全部文档;
db.testcoll.deleteMany ({age: 10, name: "周七"})
//删除 age 等于 10 的一个文档;
db.testcoll.deleteOne ({age: 10})
//删除 age 等于 10 并且 name = "周七" 的一个文档;
db.testcoll.deleteOne ({age: 10, name: "周七"})
4. 修改
4.1 去重
db.testcoll.aggregate( [ { $group : { _id : "$name" } } ] )
//或者
db.testcoll.distinct( "name" )
4.2修改指定列的第一个数据
db.testcoll.updateOne({}, { $set: { age: 8 }})
// 修改一个,默认修改第一个。将所有的score 改为 100
4.3修改指定列的全部数据
db.testcoll.updateMany({}, { $set: { score: 100 }})
// 修改全部,将所有的score 改为 100。
// $set 是修改器,表示修改列,mongodb的固定写法,
修改器 | 作用 |
---|---|
$inc | 递增 |
$rename | 重命名列 |
$set | 修改列值 |
$unset | 删除列 |
5. 逻辑判断操作符(or 、 and、not、nor)
// 运用的数据
db.testcoll.insertMany( [
{ name: "张三", age: 10, score: { "语文": 77, "英语": 37, "数学": 75 }, side: "一班" },
{ name: "李四", age: 11, score: { "语文": 55, "英语": 10, "数学": 72 }, side: "二班" },
{ name: "王五", age: 12, score: { "语文": 60, "英语": 50, "数学": 52 }, side: "一班" },
{ name: "赵六", age: 13, score: { "语文": 65, "英语": 20, "数学": 35 }, side: "二班" },
{ name: "周七", age: 14, score: { "语文": 70, "英语": 66, "数学": 37 }, side: "三班" }
]);
// 查询age小于 13 或者 英语大于40的所有文档
db.testcoll.find( { $or: [ { age: { $lt: 13} }, { "score.英语": {$gt:40} } ] } )
// 删除一行age小于 13 或者 英语大于40的文档
db.testcoll.deleteOne( { $or: [ { age: { $lt: 13} }, { "score.英语": {$gt:40} } ] } )
// 修改一行age小于 13 或者 英语大于40的文档并把数学改成100
db.testcoll.updateOne( { $or: [ { age: { $lt: 13} }, { "score.英语": {$gt:40} } ] }, { $set: { "score.数学": 100 }})
// 修改张三和王五的age,再原来的数据上+2 ,如果要减法就写 {age:-2}
db.testcoll.updateMany({name:{$in:['张三','王五']}},{$inc:{age:2}})
/
// 查询age小于 13 并且 英语大于40的所有文档
db.testcoll.find( { $and: [ { age: { $lt: 13} }, { "score.英语": {$gt:40} } ] } )
// 删除一行age小于 13 并且 英语大于40的文档
db.testcoll.deleteOne( { $and: [ { age: { $lt: 13} }, { "score.英语": {$gt:40} } ] } )
// 修改一行age小于 13 并且 英语大于40的文档并把数学改成100
db.testcoll.updateOne( { $and: [ { age: { $lt: 13} }, { "score.英语": {$gt:40} } ] }, { $set: { "score.数学": 100 }})
/
// 查询age不小于 13 的所有文档
db.testcoll.find( { age: {$not: {$lt: 13}}} )
// 删除一行age不小于 13 的文档
db.testcoll.deleteOne( { age: {$not: {$lt: 13}}} )
// 修改一行age不小于 13 的文档 改成 age = 8
db.testcoll.updateOne({ age: {$not: {$lt: 13}}}, { $set: { age: 8 }})
/
// nor = not or
// 查询age 不是 (小于 13) 或者 英语 不是 (大于40) 的所有文档
db.testcoll.find( { $nor: [ { age: { $lt: 13} }, { "score.英语": {$gt:40} } ] } )
// 删除一行 age 不是 (小于 13) 或者 英语 不是 (大于40) 的文档
db.testcoll.deleteOne( { $nor: [ { age: { $lt: 13} }, { "score.英语": {$gt:40} } ] } )
// 修改一行 age 不是 (小于 13) 或者 英语 不是 (大于40) 的文档中的数学改成100
db.testcoll.updateOne( { $nor: [ { age: { $lt: 13} }, { "score.英语": {$gt:40} } ] }, { $set: { "score.数学": 100 }})
逻辑操作符 | 格式 | 注释 |
---|---|---|
$or | $or:[ { key: value} , { key: value } ] | 满足多个条件中的一个 |
$and | $and:[ { key: value } , { key: value } ] | 同时满足多个条件,不过{key:value,key:value}的格式也是and逻辑 |
$not | $not { key: value } | 反向匹配,否定逻辑 |
$nor | $nor{ key: value } | nor = not or,反向匹配多个条件中的某一个 |
6. 条件运算符
运算符 | 格式 | 作用 |
---|---|---|
: | { key: value } | (冒号)等于 |
$lt | key:{ $lt: value } | 小于 |
$lte | key:{ $lte: value } | 小于等于 |
$gt | key:{ $gt: value } | 大于 |
$gte | key:{ $gte: value } | 大于等于 |
$ne | key:{ $ne: value } | 不等于 |
$in | key:{ $in: [1,10]} | 包含 |
$nin | key:{ $nin: [1,10]} | 不包含 |
$exists | key:{ $exists: bool} | 是否存在,bool,{$exists:true} |
$regex | key: {$regex:‘.*?’} | 匹配正则表达式 |
$type | key: {$type:int} | 判断数据类型 |
$add | $add: [$key1, $key2] | 加,将key1 + key2 |
$subtract | $subtract: [$key1, $key2] | 减,返回key1 - key2 |
$multiply | $multiply: [$key1, $key2] | 乘,返回key1 × key2 |
$divide | $divide: [$key1, $key2] | 除,返回key1 ÷ key2 |
$avg | {$avg: $key} | 平均值,返回key列的平均值 |
$mod | key: {$mod:[2,0]} | 取余,返回key列value ÷ 2 = 0 的文档 |
$min | $min: $key | 最小值,返回key列中的最小值 |
$max | $max: $key | 最大值,返回key列中的最大值 |
$push | key1:{$push: key2} | 插入,将key2的值插入到key1中返回list |
// 查询 age的值不等于11的所有文档
db.testcoll.find({age: {$ne: 11}})
// 查询 age的值是 9 或者 11 的所有文档
db.testcoll.find({age: {$in: [9,11]}})
// 查询 age的值不是 9 或者 11 的所有文档
db.testcoll.find({age: {$nin: [9,11]}})
// 查询 拥有age 列的所有文档
db.testcoll.find({age:{$exists:true}})
// 查询 英语 英语大于40,并且 拥有 age 列的所有文档
db.testcoll.find({ "score.英语": {$gt:40} ,age:{$exists:true}})
// 查询 side 中包含'一' 的 所有文档
db.testcoll.find({'side': {$regex:'一'}})
// 查询 side 的类型是 字符串对的所有文档
db.testcoll.find({'side': {$type:'string'}})
// 查询age 中 2取余得1(奇数)的所有文档。
db.testcoll.find({'age': {$mod:[2,1]}})
✍ 总结::
条件 | 作用 |
---|---|
{} | 不写 = 所有数据 |
{key:value} | 指定要求数据 |
{key:{运算符:value}} | 符合条件的数据 |
操作 | 详解 |
---|---|
写入 | 只有一个{} 写入json格式的数据 ,多行写入需要加[] |
删除 | 只有一个{} 执行具体的删除操作。 |
查询 | 第一个{} 表示以什么条件查询; 第二个{} 设定返回的字段。 |
更改 | 第一个{} 表示以什么条件进行更改; 第二个{} 执行具体的修改操作。 |