mongodb

一、基本命令

  1.使用终端连接:mongo

  2.查看当前数据库名称:db

  3.查看当前数据库信息:db.status()

  4.终端退出连接:exit或ctrl + c

  5.列出所有在物理上存在的数据库:show dbs

  6.切换数据库,如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建:use 数据库名称

  7.删除数据库:db.dropDatabase()

二、集合操作

  1.集合创建:db.createCollection(name, options)

    默认capped为false即不限制大小,当capped为true时,size为上限大小,文档达到上限时,会将之前的数据覆盖,单位为字节

    限制集合大小:db.createCollection("stu", {capped:true, size:10})

  2.查看当前数据库的结合:

    show collections

  3.删除集合

    db.集合名称.drop()

  4.插入

    db.集合名称.insert(document)

  5.简单查询

    db.集合名称.find()

  6.更新

    db.集合名称.update(

      <query>,    查询条件:类似sql语句Update中的where部分  {name:'def'}

      <update>,    更新操作符:类似sql语句update中的set部分,只更新一个字段时使用$set  {$set{name:'abc'}}

      {multi:<boolean>}  可选,默认为false,表示只更新找到的第一条记录,true时为全部更新

    )

  7.删除

    db.集合名称.remove(

      <query>,

      {

        justOne:<boolean>

      }

    )

    全部删除:db.集合名称.remove({})

三、数据查询

  1.方法fiind():查询

    db.集合名称.find({条件文档})

  2.方法findOne():查询,只返回第一个

    db.集合名称.findOne({条件文档})

  3.方法pretty():将结果格式化

    db.集合名称.find({条件文档}).pretty()

  4.比较运算符

    小于:$lt

    小于或等于:$lte

    大于:$gt

    大于或等于:$gte

    不等于:$ne

    示例:db.user.find({age:{$gte:18}})

  5.逻辑运算符

    逻辑与

      示例:db.user.find({name:'张三', age:{$gte:18}})

    逻辑或:$or

      示例:db.user.find({$or:[{age:{$gte:18}}, {name:'张三'}]})

  6.范围运算符

    在某个范围内:$in

      示例:db.user.find({age:{$in:[18, 28]}})

    不在某个范围内:$nin

  7.正则表达式

    具体规则同js

      示例:db.user.find({name:/[a-zA-z]+/})

  8.自定义查询

    使用$where后面写一个函数,返回满足条件的数据,同js函数

      示例:db.user.find({$where:function(){return this.age>20}})

  9.limit:获取几条

    db.集合.find().limit(number)

  10.skip:跳过几条

    db.集合.find().skip(number)

  11.排序:sort

    db.集合.find().sort({字段:1, 字段2:-1})

      参数1为升序排列,参数-1为降序排列

  12.统计个数:count

    db.集合.find({条件}).count()或db.集合.count({条件})

  13.消除重复:distinct

    db.集合.distinct('去重字段', {条件})

四、高级操作

  1.聚合

    db.集合.aggregate([管道:{表达式}])

      常用管道:

        $group:将集合中的文档分组,可用于统计结果

 1 db.user.aggregate([
 2     {$group:
 3          {
 4               _id:'$age',                   _id表示分组的依据
 5               counter:{$sum:1}              具体字段名前要加$
 6         }                                   使用$$ROOT可以得到整个文档
 7     }
 8 ])    

 

        $match:过滤数据,只输出符合条件的文档

1 db.user.aggregate([
2     {$match:{age:{$gt:20}}}
3 ])
4 
5 查询年龄大于20的男生、女生人数
6 db.user.aggregate([
7     {$match:{age:{$gt:20}}},
8     {$group:{_id:'$gender',counter:{$sum:1}}}
9 ])

 

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

查询学生的姓名、年龄
db.stu.aggregate([
    {$project:{_id:0,name:1,age:1}}
])

查询男生、女生人数,输出人数
db.stu.aggregate([
    {$group:{_id:'$gender',counter:{$sum:1}}},
    {$project:{_id:0,counter:1}}
])

 

        $sort:将输入文档排序后输出

查询学生信息,按年龄升序
b.stu.aggregate([{$sort:{age:1}}])

查询男生、女生人数,按人数降序
db.stu.aggregate([
    {$group:{_id:'$gender',counter:{$sum:1}}},
    {$sort:{counter:-1}}
])

 

        $limit:限制聚合管道返回的文件数

        $skip:跳过制定数量的文档,并返回余下的文档

统计男生、女生人数,按人数升序,取第二条数据
db.stu.aggregate([
    {$group:{_id:'$gender',counter:{$sum:1}}},
    {$sort:{counter:1}},
    {$skip:1},
    {$limit:1}
])

 

        $unwind:将数组类型的字段进行拆分

构造数据
db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
查询
db.t2.aggregate([{$unwind:'$size'}])


对某字段值进行拆分
处理空数组、非数组、无字段、null情况
db.t3.insert([
{ "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "b", "size" : [ ] },
{ "_id" : 3, "item" : "c", "size": "M" },
{ "_id" : 4, "item" : "d" },
{ "_id" : 5, "item" : "e", "size" : null }
])

使用语法1查询
db.t3.aggregate([{$unwind:'$size'}])
查看查询结果,发现对于空数组、无字段、null的文档,都被丢弃了
问:如何能不丢弃呢?
答:使用语法2查询
db.t3.aggregate([{$unwind:{path:'$sizes',preserveNullAndEmptyArrays:true}}])

 

      表达式:

        $sum:计算总和,$sum:1同count表示计数

        $avg:计算平均值

        $min:获取最小值

        $max:获取最大值

        $push:在结果文档中插入值到一个数组中

        $first:根据资源文档的排序获取第一个文档的数据

        $last:根据资源文档的排序获取最后一个文档的数据

 五、索引

  1.建立普通索引:db.集合.ensureIndex({属性:1})    1表示升序索引 -1表示降序索引

  2.建立唯一索引:db.集合.ensureIndex({属性:1}, {'unique':true})

  3.联合索引:db.集合.ensureIndex({name:1, age:1})

  4.查看文档所有索引:db.集合.getIndexes()

  5.删除索引:db.集合.dropIndexes('索引名称')

六、安全

  1.常用角色

    root:只在admin数据库中可用,超级账号,超级权限

    Read:只允许读取指定数据库

    readWrite:允许用户读写指定数据库

  2.创建超级管理员用户

1 use admin
2 db.createUser({
3     user:'admin',
4     pwd:'123',
5     roles:[{role:'root', db:'admin'}]
6 })

  3.安全性流程

修改配置文件
sudo vi /etc/mongod.conf
启用身份验证
注意:keys and values之间一定要加空格, 否则解析会报错
security:
authorization: enabled
重启服务
sudo service mongod stop
sudo service mongod start
终端连接
mongo -u 'admin' -p '123' --authenticationDatabase 'admin'

七、复制(主从服务器)

1.分别在两台服务器上开启服务
mongod --bind_ip 192.168.1.2 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0(此名字一定要一致)
mongod --bind_ip 192.168.1.3 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0
2.客户端连接主服务器
mongo --host 192.168.1.2 --port 27017
3.初始化
rs.initiate()
4.添加副本集
rs.add('192.168.1.3:27017')
5.连接第二个mongo服务器
mongo --host 192.168.1.3 --port 27017
6.如果在从服务器上进行读操作,需要设置rs.slaveOk()
rs.slaveOk()
db.t1.find()
7.删除从节点
rs.remove('192.168.1.3:27018')
  • -h:服务器地址,也可以指定端口号
  • -d:需要备份的数据库名称
  • -o:备份的数据存放位置,此目录中存放着备份出来的数据
 

八、备份

  1.语法:mongodump -h dbhost -d dbname -o dbdirectory

  • -h:服务器地址,也可以指定端口号
  • -d:需要备份的数据库名称
  • -o:备份的数据存放位置,此目录中存放着备份出来的数据

  2.恢复:mongorestore -h dbhost -d dbname --dir dbdirectory

  • -h:服务器地址
  • -d:需要恢复的数据库实例
  • --dir:备份数据所在位置

九、python操作mongodb

进入虚拟环境
sudo pip install pymongo
或源码安装
python setup.py
  • 引入包pymongo
import pymongo
  • 连接,创建客户端
client=pymongo.MongoClient("localhost", 27017)
  • 获得数据库test1
db=client.test1
  • 获得集合stu
stu = db.stu
  • 添加文档
s1={name:'gj',age:18}
s1_id = stu.insert_one(s1).inserted_id
  • 查找一个文档
s2=stu.find_one()
  • 查找多个文档1
for cur in stu.find():
    print cur
  • 查找多个文档2
cur=stu.find()
cur.next()
cur.next()
cur.next()
  • 获取文档个数
print stu.count()
posted @ 2018-08-05 20:08  Leur  阅读(208)  评论(0)    收藏  举报