Mongodb数据库基本操作

启动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.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: 在结果⽂档中插⼊值到⼀个数组中

   

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

posted on 2019-03-26 10:16  一剑风徽  阅读(249)  评论(0编辑  收藏  举报

导航