Mongodb数据库基本操作

启动mongodb的服务端和客户端

启动服务端

  • sudo service mongod start 或者 sudo mongod

    • sudo mongod --config /etc/mongod.conf &(加&表示后台运行)

启动客户端

  • mongo

mongodb中数据库和集合的命令
  • 数据库不需要提前创建,插入数据时,自动创建

  • show dbs /show databases # 查看所有数据库

  • use 数据库名 # 使用数据库 (可以是一个当前不存在的数据库,当其中创建了集合,则该数据库才正式创建,否则退出后依然没有)

  • 数据库名.dropDatabase() # 删除数据库

 

  • db # 查看当前所在的数据库

  • 集合不需要提前创建,插入数据时,自动创建

  • show collections # 查看所有的集合

  • db.集合名.drop() # 删除集合

  • db.集合名.find() # 集合的使用

  • db.集合名.insert({key1:value1,keys:value2,....}) # 集合插入数据

  

> show dbsadmin (empty)local 0.078GB> use test0322switched to db test0322> show dbsadmin (empty)local 0.078GB> db.createCollection("test")> show dbsadmin (empty)local 0.078GBtest0322 0.078GB> show collectionssystem.indexestest> 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.dropDatabase()

删除集合的命令: 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$‘}})

skip 和 limit
  • ?法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: 在结果?档中插?值到?个数组中

   

# groupdb.test1.aggregate({$group:{_id:$gender,counter:{$sum:1}}}){ "_id" : false, "counter" : 18 }{ "_id" : true, "counter" : 27.8 }# group by nulldb.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 }
mongodb创建简单的索引方法
  • 语法:

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

View Code

相关文章