mongodb

2021/6/3 19:22:43

本文主要是介绍mongodb,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

mogodb

    • pymongo
    • 数据库的操作
    • 集合的操作
    • 保存
    • 更新数据
    • 删除
    • 查找
    • pretty美化
    • 比较运算符:
    • 范围运算符
    • 逻辑运算符
    • MongoDB可以用正则表达式
    • limt 和skip
    • 自定义查询
    • 排序
    • 计数:
    • 投影
    • 消除重复
    • 备份
    • 聚合aggregate
      • 常用管道
      • $group
      • $group的注意点
      • $sort
      • l i m i t 和 limit 和 limit和skip
      • $unwind(某个数组拆分多条)
    • 索引

下载 MongoDB
mongodb官网

pymongo

from pymongo import MongoClient

# 实例化 client,建立连接
client=MongoClient(host="127.0.0.1",port=27017) # 自己的电脑上其实可以不写

# 选择test 的数据库,在选t1的集合
collection = client["test"]["t1"]

# 插入一条数据:
collection.insert({"_id":10,"name":"tangtang","age":10})

# 把上面的传一个等于一个变量会怎么样呢?
t=collection.insert({"_id":10,"name":"tangtang","age":10})
# 结果: t=10 ,把它赋值给变量会获取到他的_id

# 插入多条数据:
data_list=[{"name":i} for i in range(10)]
collection.insert_many(data_list)

# 查询一条数据
t=collection.find_one({"name":"tangtang"})
print(t)
# 查询多条数据,
t=collection.find({"name":"tangtang"})
print(t) # 返回的类型是 一个cursor 对象
# 第一次 在用 i 循环的时候会有数据,在用j循环的时候不会有数据,因为,他的游标在后面去了没有数据咯
for i in t:
    print(i)
for j in t:
    print(j)

# 更新一条数据
collection.update_one({"name":"tangtang"},{"$set":{"name":"miaomiao"}})
                       # 前面是要改的条件,后面是要改的内容
# 全部更新:
collection.update_many({"name":"tangtang"},{"$set":{"name":"miaomiao"}})

# 删除一条
collection.delete_one({"name":"tangtang"})

# 删除多条
collection.delete_many({"name":"tangtang"})

Mongodb的基础命令

数据库的操作

查看当前的数据库:db
查看所有的数据库:show dbs 或者 show databases
切换数据库:ues db_name(name 是名字 _下划线记得别忘记了)或者 ues +名字  (use tang   使用tang这个数据库)
删除当前的数据库:db.dropDatabase()

集合的操作

不手动动创建集合
可以使用没有的集合,他会自己创建,添加数据集合就建立了
手动创建:
db.createCollection(name,options)
db.createCollection(集合名字)
db.createCollection("",{capped:true,size:10})
参数capped:默认值为fasle表示不设置上限,值为ture 表示设置上限
参数size:当capped值为ture时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节
'查看集合:'show collections
"删除集合": db.集合名称.drop()
"插如集合:"db.集合名称.insert("这里是要插入的东西(字典)")
列如: db.test.insert({"name":"我是小水水啊"})
"显示集合:" db.集合名.find()

保存

db.集合名称.save({ '内容'})
如果文档的_id已经存在则修改,如果文档的_id不存在就会添加
(插入的时候可以用这个,如果有相同的_id也不会报错了)

更新数据

假如集合里是: {name:"小红",age:10}

db.集合名.update({name:"小红"},{name:"小明"})
---这个是把有小红的name 替换成小明的name,是整条数据的替换,替换后只有{"name","小明"} 没有其他的数据了 
db.集合名.update({name:"小红"},{$set:{name:"小明"}})
---变成了 {name:"小明",age:10}
  • 更新多条:
假如集合里是: 
{name:"小红",age:10}
{name:"小红",age:11}
{name:"小红",age:18} 

db.集合名.update({name:"小红"},{$set:{name:"小明"}},{multi:true})
multi 必须和 $ 一起用 

删除

db.集合名.remove({name:"小红"},{justOne:true}) 这个只删一条数据
db.集合名.remove({name:"小红"}) 默认全部删除

查找

db.集合名.find({age:18}) # 寻找所有age 等于18 的
db.集合名.findone(age:18) # 寻找一个age等于18

pretty美化

db.集合名.findone(age:18).pretty() # 美化PPT

比较运算符:

  • 等于: 默认是等于判断,没有运算符
  • 小于: $lt (less than)
  • 小于等于: $lte (less than equal)
  • 大于: $gt (greater than)
  • 大于等于:$gte
  • 不等于 : $ne

案例
查找年龄小于18的
db.集合名.find({age:{$lte:18}})

范围运算符

使用python "$in","$nin"判断是否在某个范围内
查询年龄为18,28的学生

db.集合名.find({age:{$in:[18,28]}})

查询在18到28之内的学生

db.集合名.find(age:{$nin:[18,28]})

逻辑运算符

and : 在json 中写多个条件即可

查询年龄大于等于18,并且性别为true的学生
db.集合名.find({age:{$gte:18},gender:ture})

or :使用$or ,值为数组.数组中的每个元素为json

查询年龄大于18,或性别为false的学生
db.集合名.find({$or:[{age:{$gte:18}},{gender:ture}],name:"郭靖"})

MongoDB可以用正则表达式

使用 /这里是正则/ 或者regex编写正则表达式
查询姓黄的学生

db.集合名.find({name:/^黄/})
db.集合名find({name:{$regex:^'黄'}})

limt 和skip

db.集合名.find({age:18}).limit(2) 只要前两个
db.集合名.find({age:18}) .skip(2) 不要前两个,之后的都要
db.集合名.find({age:18}) .skip(2).limit(2) 联合用

自定义查询

用js 进行查询
使用$where后面写一个函数,返回满足条件的数据查询年龄大于30的学生

db.集合名.find({
	$where:function(){
	return this.age>30}
}
{name:1,age:1}        这里要注意 这个只显示了name和age
)
db.集合名.find({
	$where:function(){
	return this.age>30}
}
)  这个显示所有

排序

方法sort(), 用于对 集进行排序db.集合名.find().sort({字段:1})
“参数1为升序排列”
“参数-1位降序排列”
根据性别降序,在根据年龄升序

db.集合名.find().sort({gender:-1,age:1})

计数:

db.集合名.find({条件}).count()
db.集合名.count(条件)

投影

  • 投影:选择返回结果字段
  • db.集合名.find({条件},{name:1,_id:0})
  • 1._id 默认会显示
  • 2.除了_id之外其他的字段,如果不显示,不写,不能写为0

消除重复

db.集合名.distinct("字段":{条件}) ----- 返回一个列表 里面是不重复的字段
db.集合名.distinct("age":{age:{$gt:10}}) 在age里面找大于10岁不重复的

备份

备份语法;
mongodump -h 服务器 -d 数据库名 -o 路径

如果是本机上的 不需要 -h ,-d.
数据的恢复 :
mongorestore -h 恢复到那个服务器 -d 恢复到那个数据库 -dir 恢复到那个位置

聚合aggregate

聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
db.集合名称.aggregate({管道:{表达式)

常用管道

在mongodb中,文档处理完毕后,通过管道进行下一次处理常用管道如下:

'''
$group:将集合中的文档分组,可用于统计结果
$match:过滤数据,只输出符合条件的文档
$project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
$sort:将输入文档排序后输出
$limit:限制聚合管道返回的文档数
$skig:跳过指定数量的文档,并返回余下的文档$unwind:将数组类型的字段进行拆分
'''

表达式
处理输入文档并输出语法:表达式:
$列名'常用表达式: $sum:计算总和,$sum:1表示以一倍计数$avg:计算平均值 $min:获取最小值 $max:获取最大值 $push:在结果文档中插入值到一个数组中 $first:根据资源文档的排序获取第一个文档数据 $last:根据资源文档的排序获取最后一个文档数据

$group

如果 _id 为null 就是全部成为一组
在这里插入图片描述

可用多个$group进行分组

db.集合名.aggregate(
		{$group:{}}
		{$group:{}}
)

按性别分组:

db.集合名.aggregate(
		{$group:{_id:"$gender"}}
)
结果:{_id:男}
	{_id:女}

按性别分组并且计数

db.集合名.aggregate(
		{$group:{_id:"$gender",count:{$sum:1}}} 
)
sum 是指一个算一个,如果是sum 是2, 一个算两个

按性别分组,算出平均年龄:

db.集合名.aggregate(
		{$group:{_id:"$gender",avg_age:{$avg:"$age"}}}
)
结果:
{_id:男,avg_age:18}
{_id:女,avg_age:16}

改变_id 的显示:

db.集合名.aggregate(
		{$group:{_id:"$gender",avg_age:{$avg:"$age"}}},
		{$project:{gender:"_id",avg_age:"$avg_age"}} 取的上一个管道里面的数据
)
结果
{gender:男,avg_age:18}
{gender:女,avg_age:16}

过滤数据:
在这里插入图片描述
去重
可以 把所有的字段放到group里面分组就可以去重复了

$group的注意点

-$group对应的字典中有几个键,结果中就有几个键
分组依据需要放到_id后面
取不同的字段的值需要使用$, $gender , $age
取字典嵌套的字典中的值的时候$_id. country 用点(.)
能够同时按照多个键进行分组{$group:{_id:{country:"$country" , province:"$province"}}}
结果是:{_id:{country: " ",province:" "}} 这时候就用点访问 里面的数据! 在进行选择

$sort

在这里插入图片描述

l i m i t 和 limit 和 limit和skip

在这里插入图片描述

$unwind(某个数组拆分多条)

在这里插入图片描述
在这里插入图片描述

索引

在这里插入图片描述
在这里插入图片描述



这篇关于mongodb的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程