Mongodb数据库基本操作
启动服务端
-
sudo service mongod start 或者 sudo mongod
-
sudo mongod --config /etc/mongod.conf &(加&表示后台运行)
-
启动客户端
-
mongo
mongodb中数据库和集合的命令
-
数据库不需要提前创建,插入数据时,自动创建
-
show dbs /show databases # 查看所有数据库
-
use 数据库名 # 使用数据库 (可以是一个当前不存在的数据库,当其中创建了集合,则该数据库才正式创建,否则退出后依然没有)
-
db.dropDatabase() # 删除数据库,不过要先进入该库-- use 要删除的库名
-
db # 查看当前所在的数据库
-
集合不需要提前创建,插入数据时,自动创建
-
show collections # 查看所有的集合
-
db.集合名.drop() # 删除集合
-
db.集合名.find() # 集合的使用
-
db.集合名.insert({key1:value1,keys:value2,....}) # 集合插入数据
> show dbs admin (empty) local 0.078GB > use test0322 switched to db test0322 > show dbs admin (empty) local 0.078GB > db.createCollection("test") > show dbs admin (empty) local 0.078GB test0322 0.078GB > show collections system.indexes test > db.test.find() > db.test.insert({gender:"boy",_id:"1001"}) WriteResult({ "nInserted" : 1 }) > db.test.find() { "_id" : "1001", "gender" : "boy" } > db.test.insert({gender:"boy"}) WriteResult({ "nInserted" : 1 }) > db.test.find() { "_id" : "1001", "gender" : "boy" } { "_id" : ObjectId("5c94ebcd09befcda98f4448d"), "gender" : "boy" }
删除集合的命令: db.集合名.drop()
命令:db.集合名称.remove(<query>,{justOne: <boolean>})
-
db.集合名.remove({条件},{justOne:false}) # 默认删除全部,值为false,如果只删除一条,需要把值设为true或1.
比较运算符
插入测试数据
db.test1.insert([ {"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true }, {"name" : "⻩蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false }, {"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false }, {"name" : "⻩药师", "hometown" : "桃花岛", "age" : 40, "gender" : true }, {"name" : "段誉", "hometown" : "⼤理", "age" : 16, "gender" : true }, {"name" : "段王爷", "hometown" : "⼤理", "age" : 45, "gender" : true }, {"name" : "洪七公", "hometown" : "华⼭", "age" : 18, "gender" : true } ])
-
-
⼩于:
$lt (less than)
-
⼩于等于:
$lte (less than equal)
-
⼤于:
$gt (greater than)
-
⼤于等于:
$gte
-
不等于:
$ne
db.test1.find({age:{$gt:18}})
逻辑和范围运算符
or:使⽤$or, 值为数组, 数组中每个元素为json
查询年龄⼤于18, 或性别为false的学⽣
db.test1.find({$or:[{age:{$gt:18},gender:false}]})
查询年龄⼤于等于18或性别为男⽣, 并且姓名是郭靖
db.test1.find({$or:[{age:{$gte:18},gender:true}],name:'gj'})
使⽤$in
, $nin
判断数据是否在某个数组内
查询年龄为18、 28的学⽣
db.test1.find({age:{$in:[18,28]}})
支持正则表达式
使⽤//或$regex编写正则表达式
插入测试数据
db.regex.insert([ { "_id" : 100, "sku" : "abc123", "description" : "Single line description" }, { "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }, { "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" }, { "_id" : 103, "sku" : "xyz789", "description" : "Multiple\nline description" } ])
查询sku以abc开头的数据
db.regex.find({sku:/^abc/})
查询sku以789结尾的数据
db.regex.find({sku:{$regex:'789$'}})
-
⽅法limit(): ⽤于读取指定数量的⽂档
db.集合名称.find().limit(NUMBER)
查询2条学⽣信息
db.test1.find().limit(2) -
⽅法skip(): ⽤于跳过指定数量的⽂档
db.集合名称.find().skip(NUMBER)
-
同时使用
db.stu.find().limit(4).skip(5)
或
db.stu.find().skip(5).limit(4)
提示注意:先使用skip在使用limit的效率要高于前者
投影&排序&统计&去重
投影命令:db.集合名称.find({},{字段名称:1,...})
db.test1.find({},{name:1,_id:0})
排序命令:db.集合名称.find().sort({字段:1,...})
db.test1.find().sort({age:1,gender:-1})
统计命令:db.集合名称.find({条件}).count()
or 命令:db.集合名称.count({条件})
db.test1.count({age:{$gt:18},gender:true})
去除重复命令:db.集合名称.distinct('去重字段',{条件})
db.test1.distinct('hometown')
聚合操作
语法:db.集合名称.aggregate({管道:{表达式}})
常用管道命令
在mongodb中,⽂档处理完毕后, 通过管道进⾏下⼀次处理 常用管道命令如下:
-
$group
: 将集合中的⽂档分组, 可⽤于统计结果 -
$match
: 过滤数据, 只输出符合条件的⽂档 -
$project
: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果 -
$sort
: 将输⼊⽂档排序后输出 -
$limit
: 限制聚合管道返回的⽂档数 -
$skip
: 跳过指定数量的⽂档, 并返回余下的⽂档
常用表达式
表达式:处理输⼊⽂档并输出 语法:表达式:'$列名'
常⽤表达式:
-
$sum
: 计算总和, $sum:1 表示以⼀倍计数 -
$avg
: 计算平均值 -
$min
: 获取最⼩值 -
$max
: 获取最⼤值 -
$push
: 在结果⽂档中插⼊值到⼀个数组中
# group db.test1.aggregate({$group:{_id:'$gender',counter:{$sum:1}}}) { "_id" : false, "counter" : 18 } { "_id" : true, "counter" : 27.8 } # group by null db.test1.aggregate({$group:{_id:null,counter:{$sum:1}}}) { "_id" : null, "counter" : 7 } # 数据透视 db.test1.aggregate({$group:{_id:null,name:{$push:'$name'}}}) { "_id" : null, "name" : [ "郭靖", "⻩蓉", "华筝", "⻩药师", "段誉", "段王爷", "洪七公" ] } #使用$$ROOT可以将整个文档放入数组中 db.test1.aggregate({$group:{_id:null,name:{$push:'$$ROOT'}}}) # 练习 # 添加测试数据 db.user.insert([{ "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.user.aggregate({$group:{_id:{country:'$country',province:'$province',userid:'$userid'}}},{$group:{_id:{country:'$_id.country',province:'$_id.province'},count:{$sum:1}}}) # { "_id" : { "country" : "china", "province" : "sh" }, "count" : 3 } # { "_id" : { "country" : "china", "province" : "bj" }, "count" : 2 } # match 查询 db.test1.aggregate({$match:{age:{$gt:18}}},{$group:{_id:'$gender',count:{$sum:1}}}) # { "_id" : true, "count" : 3 } # project 用于修改文档的输入输出结构,比如重命名,增加,删除字段 db.test1.aggregate({$project:{_id:0,name:1,age:1}}) # 投影 db.user.aggregate({$group:{_id:{country:'$country',province:'$province',userid:'$userid'}}},{$group:{_id:{country:'$_id.country',province:'$_id.province'},count:{$sum:1}}},{$project:{_id:0,country:'$_id.country',province:'$_id.province',counter:'$count'}}) ''' { "country" : "china", "province" : "sh", "counter" : 3 } { "country" : "china", "province" : "bj", "counter" : 2 } ''' # sort db.test1.aggregate({$group:{_id:'$gender',count:{$sum:1}}},{$sort:{count:1}}) # { "_id" : false, "count" : 2 } # { "_id" : true, "count" : 5 } # skip & limit db.test1.aggregate( {$group:{_id:"$gender",counter:{$sum:1}}}, {$sort:{counter:-1}}, {$skip:1}, {$limit:1} ) # { "_id" : false, "counter" : 2 }
-
语法:
-
db.集合.ensureIndex({属性:1})
,1表示升序, -1表示降序 -
db.集合.createIndex({属性:1})
-
上面两个命令效果等价
-
-
具体操作:db.db_name.ensureIndex({name:1})
索引的查看
默认情况下_id是集合的索引
查看方式:db.collection_name.getIndexes()
创建唯一索引
db.collection_name.ensureIndex({"name":1},{"unique":true})
删除索引
语法:db.t1.dropIndex({'索引名称':1})
建立符合索引
建立复合索引的语法:db.collection_name.ensureIndex({字段1:1,字段2:1})
mongodb的备份和恢复
-
备份的语法:
mongodump -h dbhost -d dbname -o dbdirectory
-
-h
: 服务器地址, 也可以指定端⼝号 -
-d
: 需要备份的数据库名称 -
-o
: 备份的数据存放位置, 此⽬录中存放着备份出来的数据
示例:mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
恢复语法:mongorestore -h dbhost -d dbname --dir dbdirectory
-
-h
: 服务器地址 -
-d
: 需要恢复的数据库实例 -
--dir
: 备份数据所在位置
示例:mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1
manogodb与python的交互
pymongo
提供了mongdb和python交互的所有方法 安装方式: pip install pymongo
from pymongo import MongoClient # 创建数据库连接对象 client = MongoClient(host='127.0.0.1',port=27017) # 选择具体的存储数据库和集合,client[db_name][collection] collection = client['test0322']['t1'] # 插入一条数据 # ret = collection.insert_one({'name':'jason','age':26}) # print(ret) # 插入多条数据 # item_list = [{'name':'py_{}'.format(i)} for i in range(10)] # t = collection.insert_many(item_list) # 查询一条数据 # t = collection.find_one({'name':'py_0'}) # print(t) # 查询全部数据 t = collection.find({'name':'py_9'}) #结果是一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针, # 可以使用强制类型转换成列表就可重复从列表中取值 t = list(t) for i in t: print(i) print('*'*100) for i in t: #此时t中没有内容 print(i) #更新一条数据 # collection.update({'name':'py_1'},{'$set':{'name':'py_2'}}) # 更新全部数据 # collection.update_many({'name':'py_2'},{'$set':{'name':'py_0'}}) # 删除一条数据 # collection.delete_one({'name':'py_0'}) # 删除全部数据 # collection.delete_many({'name':'py_0'})