MongoDB入门

 命名行操作

show dbs 查看当前服务器存在多少DB

use ss1db CreateDatabase 使用不存在的对象即创建该对象 没有即创建

show tables 查看当前DB中有多少表(Collection)

mongodb的数据存储结构 :
user = [{
name:dragon,
age:20,
gender:"man"
},]

ObjectID :Documents 自生成的 _id
	objectID是⼀个12字节的⼗六进制数:
	前4个字节为当前时间戳,接下来3个字节的机器ID
	接下来的2个字节中MongoDB的服务进程id,最后3个字节是简单的增量值
String: 字符串,必须是utf-8
Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写)
Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
Double:浮点数 (没有float类型,所有小数都是Double)
Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦)
Object:如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典
Null:空数据类型 , 一个特殊的概念,None Null
Timestamp:时间戳
ISODate:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
01.数据类型
不手动创建集合:
向不存在的集合中第⼀次加⼊数据时, 集合会被创建出来

手动创建集合:
db.createCollection(name,options)
db.createCollection("stu")
db.createCollection("sub", { capped : true, size : 10 } )
参数capped: 默认值为false表示不设置上限,值为true表示设置上限
参数size: 当capped值为true时, 需要指定此参数, 表示上限⼤⼩,当⽂档达到上限时, 会将之前的数据覆盖, 单位为字节

查看集合:show collections
删除集合:db.集合名称.drop()
02.集合操作
增:
insert x 官方已经不推荐使用这个LowB的方法了
insertOne({name:"123"}) 插入一条数据行(document)
insertMany([{name:"123"},{name:"234"},{name:"345"}]) 插入多行数据

查:
查的时候没有findMany
findOne({name:"123"}) 	查询满足条件的第一条数据
find({name:"123"}) 		查询所有满足条件的数据
find({条件}).pretty(): 将结果格式化
find({条件},{_id:0,name:1,gender:1})  投影 (条件可以不写)
	参数为字段与值,默认是不显示, 值为1表示显示
	特殊: 对于_id列默认是显示的, 如果不显示需要明确设置为0

改:
update x 官方已经不推荐使用这个LowB的方法了
updateOne({name:"123"},{$set:{gender:"man",age:20}}) 修改满足条件的第一条数据
updateMany({name:"123"},{$set:{gender:"man",age:20}}) 修改所有满足条件的数据 即使只有一条也可以
updateMany({},{$set:{gender:"man",age:20}}) 更新全部(没有则创建)
$set: 修改器,将某个Key的值修改为某个值

删:
deleteOne({name:"123"}) 删除满足条件的第一条数据
deleteMany({name:"123"}) 删除所有满足条件的数据
remove({})清空数据
02.增删改查
$关键字:数学比较符,范围表达式,逻辑运算符
db.student.find({age:{$lt:25}})
db.student.find({age:{$lte:25}})
db.student.find({age:{$gt:23}})
db.student.find({age:{$gte:23}})
db.stu.find({age:{$in:[18,28]}})


$修改器:
1.$set: 将某个Key的值修改为某个值
2.$unset: 删除字段(field) db.student.updateOne({age:84},{$unset:{head:1}})
3.$inc : 将原有值增加多少 db.student.updateOne({age:85},{$inc:{age:1000}})
4.$push: [].append() 在arrays中在最后位置追加一个数据 db.student.updateOne({age:1085},{$push:{hobby:"chezhen"}})
5.$pull: [].remove(item) 在array中删除一个元素 db.student.updateOne({age:1085},{$pull:{hobby:"chezhen"}})
6.$pop : 删除array中的第一个或最后一个元素,-1:第一个 1:最后一个
03.$关键字 与 $修改器
⽅法sort(), ⽤于对集合进⾏排序
db.集合名称.find().sort({字段:1,...})
参数1为升序排列
参数-1为降序排列
根据性别降序, 再根据年龄升序
db.stu.find().sort({gender:-1,age:1})

limit(2) : 选取,从0-2的数据
skip(2) : 跳过 2 条数据 从第3条数据开始 
分页查询:
skip(page+count).limit(count)     (先skip再limit,效率要高一下)

⽅法count()⽤于统计结果集中⽂档条数
db.集合名称.find({条件}).count()
db.集合名称.count({条件})
db.stu.find({gender:true}).count()
db.stu.count({age:{$gt:20},gender:true})


⽅法distinct()对数据进⾏去重
db.集合名称.distinct('去重字段',{条件})
db.stu.distinct('hometown',{age:{$gt:18}})
04.排序,分页,count,distinct
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。 
db.集合名称.aggregate({管道:{表达式}})

在mongodb中,⽂档处理完毕后, 通过管道进⾏下⼀次处理
常用管道如下:
$group: 将集合中的⽂档分组, 可⽤于统计结果
$match: 过滤数据, 只输出符合条件的⽂档
$project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
$sort: 将输⼊⽂档排序后输出
$limit: 限制聚合管道返回的⽂档数
$skip: 跳过指定数量的⽂档, 并返回余下的⽂档
$unwind: 将数组类型的字段进⾏拆分



常用聚合表达式

语法:表达式:'$列名'
常⽤表达式:
$sum: 计算总和, $sum:1 表示以⼀倍计数
$avg: 计算平均值
$min: 获取最⼩值
$max: 获取最⼤值
$push: 在结果⽂档中插⼊值到⼀个数组中
$first: 根据资源⽂档的排序获取第⼀个⽂档数据
$last: 根据资源⽂档的排序获取最后⼀个⽂档数据

=========================
$group
$group _id表示分组的依据,使用某个字段的格式为 ‘$字段’ ,当_id:null 则表示所有的文档分为一组

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


$project 
修改输入文档的结构,如,重命名,增加,删除字段,创建计算结果

$match  
用于过滤数据,只输出符合条件的文档,能将结果交给后一个管道
但是find不可以
05.管道 分组 聚合

 

db.stu.find(
  {$or:[{age:{$gte:20}},{hometown:{$in:["桃花岛","华⼭"]}}]}
  )

#按照gender进行分组,获取不同组数据的个数和平均年龄
db.stu.aggregate(
  {$group:{_id:"$gender",count:{$sum:1},avg_age:{$avg:"$age"}}},
  {$project:{gender:"$_id",count:1,avg_age:"$avg_age",_id:0}}
  )
# 按照hometown进行分组,获取不同组的平均年龄
db.stu.aggregate(
  {$group:{_id:"$hometown",mean_age:{$avg:"$age"}}}
  )
#使用$group统计整个文档
db.stu.aggregate(
  {$group:{_id:null,count:{$sum:1},mean_age:{$avg:"$age"}}}
  )
#选择年龄大于20的学生,观察男性和女性有多少人
db.stu.aggregate(
  {$match:{$or:[{age:{$gt:20}},{hometown:{$in:["蒙古","⼤理"]}}]}},
  {$group:{_id:"$gender",count:{$sum:1}}},
  {$project:{_id:0,gender:"$_id",count:1}}
  )

练习:
{ "country" : "china", "province" : "sh", "userid" : "a" }  
{  "country" : "china", "province" : "sh", "userid" : "b" }  
{  "country" : "china", "province" : "sh", "userid" : "a" }  
{  "country" : "china", "province" : "sh", "userid" : "c" }  
{  "country" : "china", "province" : "bj", "userid" : "da" }  
{  "country" : "china", "province" : "bj", "userid" : "fa" }  
需求:统计出每个country/province下的userid的数量(同一个userid只统计一次)

答案:
db.tv3.aggregate(
  {$group:{_id:{country:"$country",province:"$province",userid:"$userid"}}},
  {$group:{_id:{country:"$_id.country",province:"$_id.province"},count:{$sum:1}}},
  {$project:{country:"$_id.country",province:"$_id.province",count:1,_id:0}}
  )
05.案例
索引:以提升查询速度

测试:插入10万条数据到数据库中
for(i=0;i<100000;i++){db.t12.insert({name:'test'+i,age:i})}

db.t1.find({name:'test10000'})
db.t1.find({name:'test10000'}).explain('executionStats')

建立索引之后对比:
语法:db.集合.ensureIndex({属性:1}),1表示升序, -1表示降序
具体操作:db.t1.ensureIndex({name:1})
db.t1.find({name:'test10000'}).explain('executionStats')


创建唯一索引:(在默认情况下创建的索引均不是唯一索引)
     db.t1.ensureIndex({"name":1},{"unique":true})  
创建唯一索引并消除重复:
     db.t1.ensureIndex({"name":1},{"unique":true,"dropDups":true})  
建立联合索引(什么时候需要联合索引):
     db.t1.ensureIndex({name:1,age:1})
查看当前集合的所有索引:
     db.t1.getIndexes()
删除索引:
     db.t1.dropIndex('索引名称')
06.索引
备份的语法:
    mongodump -h dbhost -d dbname -o dbdirectory
-h: 服务器地址, 也可以指定端⼝号
-d: 需要备份的数据库名称
-o: 备份的数据存放位置, 此⽬录中存放着备份出来的数据

恢复语法:
     mongorestore -h dbhost -d dbname --dir dbdirectory
-h: 服务器地址
-d: 需要恢复的数据库实例
--dir: 备份数据所在位置

eg: mongorestore -d test2 --dir ~/Desktop/test1bak/test1
   
07.数据的备份和恢复

 pymongo模块

 1 mongo_conn = pymongo.MongoClient(host="127.0.0.1",port=27017) 建立连接
 2 mongo_db = mongo_conn["test2"] 选取数据
 3 
 4 查询:
 5 #pymongo的Cursor对象需要循环,循环到最后一个后,无法再次使用for循环
 6 res = mongo_db.student.find({"name":"alex"}) 
 7 for i in res:
 8     print(i)
 9 
10 res = mongo_db.student.find_one({"age":25}) 返回的是一个Dict
11 print(res)
12 
13 增加:
14 res = mongo_db.student.insert_one({"name":"nezha","age":20})
15 print(res)  # inserOneResult
16 print(res.inserted_id) # 当前插入对象的_id
17 
18 res = mongo_db.student.insert_many([{"name":"nezha1","age":20},{"name":"nezha2","age":20}])
19 print(res) inserManyResult
20 print(res.inserted_ids) # 当前插入所有对象的_id 是个list
21 
22 更新:
23 res = mongo_db.student.update_one({"name":"nezha1"},{"$set":{"age":22}})
24 print(res) UpdateResult
25 print(res.acknowledged) # True 更新成功
26 
27 res = mongo_db.student.update_many({"age":30},{"$set":{"age":25}})
28 print(res) UpdateResult
29 print(res.raw_result) # 受影响行数
30 print(res.acknowledged) # True 更新成功
31 
32 删除:
33 res = mongo_db.student.delete_one({"name":"nezha1"})
34 print(res) DeleteResult
35 print(res.acknowledged) # True 删除成功
36 print(res.deleted_count) # 删除行数 只能是1
37 print(res.raw_result) 受影响行数
38 
39 res = mongo_db.student.delete_many({"age":25})
40 print(res) DeleteResult
41 print(res.acknowledged) # True 删除成功
42 print(res.deleted_count) # 删除行数 可以大于1
43 print(res.raw_result) 受影响行数
44 
45 清除数据:
46 res = mongo_db.student.remove({})
47 print(res) # 受影响行数 返回值 n > 0 清楚成功
48 
49 
50 # 查询_id等于 5b7e0a6eaeb4a3336c0f9b71
51 # from bson import ObjectId #必须使用ObjectId去查询_id
52 # res = mongo_db.school.find_one({"_id":ObjectId("5b7e0a6eaeb4a3336c0f9b71")})
53 # print(res)
54 
55 limit skip sort:
56 sort的用法,与pymysql中的用法及其相似,已经不是mongodb中的sort用法
57 res = mongo_db.school.find({}).limit(2).skip(1).sort("name",pymongo.ASCENDING)
58 for i in res:
59     print(i)
01.操用操作

参考:

1.https://www.w3cschool.cn/mongodb/

2.https://docs.mongodb.com/

原文地址:https://www.cnblogs.com/carlous/p/10668724.html