命名行操作
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类型,时间戳可以秒杀一切时间类型)

不手动创建集合: 向不存在的集合中第⼀次加⼊数据时, 集合会被创建出来 手动创建集合: db.createCollection(name,options) db.createCollection("stu") db.createCollection("sub", { capped : true, size : 10 } ) 参数capped: 默认值为false表示不设置上限,值为true表示设置上限 参数size: 当capped值为true时, 需要指定此参数, 表示上限⼤⼩,当⽂档达到上限时, 会将之前的数据覆盖, 单位为字节 查看集合:show collections 删除集合:db.集合名称.drop()

增: 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({})清空数据

$关键字:数学比较符,范围表达式,逻辑运算符 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:最后一个

⽅法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}})

聚合(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不可以

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}} )

索引:以提升查询速度 测试:插入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('索引名称')

备份的语法: 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
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)
参考: