当先锋百科网

首页 1 2 3 4 5 6 7

⭐ 简介:大家好,我是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 }(冒号)等于
$ltkey:{ $lt: value }小于
$lte key:{ $lte: value }小于等于
$gtkey:{ $gt: value }大于
$gtekey:{ $gte: value }大于等于
$nekey:{ $ne: value }不等于
$inkey:{ $in: [1,10]}包含
$nin key:{ $nin: [1,10]}不包含
$existskey:{ $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列中的最大值
$pushkey1:{$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格式的数据 ,多行写入需要加[]
删除只有一个{} 执行具体的删除操作。
查询第一个{} 表示以什么条件查询;
第二个{} 设定返回的字段。
更改第一个{} 表示以什么条件进行更改;
第二个{} 执行具体的修改操作。