MongoDB入门

环境交代

操作系统: CentOS 6.8 64位

mongodb: 4.06

安装

官方下载地址:https://www.mongodb.org/dl/linux/x86_64-rhel62

阿里云镜像地址:

mongodb-server: https://mirrors.aliyun.com/mongodb/yum/redhat/6/mongodb-org/4.0/x86_64/RPMS/mongodb-org-server-4.0.6-1.el6.x86_64.rpm

mongodb-shell: https://mirrors.aliyun.com/mongodb/yum/redhat/6/mongodb-org/4.0/x86_64/RPMS/mongodb-org-shell-4.0.6-1.el6.x86_64.rpm

如果我们下载的mongodb是社区版的源码包,那么官方已经帮我们编译好,因此不需要我们再次编译,我们只需将下载的文件解压后移动到安装目录即可,比如:移动到/usr/local/mongodb。

当然我们这里使用的是rpm包安装:

下载:

 wget https://mirrors.aliyun.com/mongodb/yum/redhat/6/mongodb-org/4.0/x86_64/RPMS/mongodb-org-server-4.0.6-1.el6.x86_64.rpm
 
 wget https://mirrors.aliyun.com/mongodb/yum/redhat/6/mongodb-org/4.0/x86_64/RPMS/mongodb-org-shell-4.0.6-1.el6.x86_64.rpm

安装

rpm -ivh mongodb-org-server-4.0.6-1.el6.x86_64.rpm
rpm -ivh mongodb-org-shell-4.0.6-1.el6.x86_64.rpm

执行完以上两个步骤,安装完成后,我们的系统中会多出两个命令:mongo(客户端) 和 mongod(服务端),同时生成一个配置文件在/etc/mongod.conf

启动

启动服务端

方式1:

# 指定配置文件启动
mongod --config /etc/mongod.conf

方式2:

如果先使用上一种方式启动,那么使用下面的方法的时候很可能会遇到错误,错误可根据报错内容以及日志内容进行解决。默认日志路径:/var/log/mongodb/mongod.log。以下方式启动,会默认使用/etc/mongod.conf的配置文件。

# 启动
service mongod start
# 重启
service mongod restart
# 关闭
service mongod stop

# 设置开机启动
chkconfig mongod on

mongodb配置说明请参考:

https://www.jianshu.com/p/ba63f6c5ad04

https://www.cnblogs.com/zhoujinyi/p/3130231.html

启动客户端

# 启动客户端连接服务端
mongo

#客户端的更多使用方式查看
mongo --help

使用

基本使用

# 查看数据库
show dbs
show databases

查看数据表(其实叫集合更合适)的列表
show tables
show collections

# 切换数据库
use tableName 

# 查看命令帮助
db.help() 

# 删除tableName表,tableName为表名称
db.tableName.drop() 

# 删除当前切换到的数据库
db.dropDatabase() 

# 创建表
db.createCollection(tableName) 

隐式添加

如果下级结构添加了,那么上级结构自动也被添加

比如:我在一个不存在的数据库下创建了一张表,那么这个数据库会被自动创建。

数据表也支持隐式创建

插入数据

db.tableName.insert()

例1:往user表插入一条

db.user.insert({'name':'shusheng'})
db.user.insertOne({'name':'shusheng'})

例2:往user表插入多条

db.user.insert([{'name':'郭昌松','age':20}, {'name':'李志友','girl':['李文斌,李志光']}])
db.user.insertMany([{'name':'郭昌松','age':20}, {'name':'李志友','girl':['李文斌,李志光']}])

MongoDb支持的数据类型

数据类型 说明 补充说明
Object ID 文档id
String 字符串 必须是utf-8编码
Boolean 布尔值 只能是 true或者false
Double 浮点型
Arrays 数据(列表)
Object 类似于Python的字典或者js中的json
Null 只能存Null
TimeStamp 时间戳
Date unix格式的时间 YYYY-MM-DD new Date('2019-02-14')

注:

每个文档都有的一个属性,其名字为_id,我们可以自己设置,如果未设置,那么mongodb会自动抱我生成,类型为Object ID。自动生成的Object ID是由12位的16进制数组成。前4个为当前时间戳,接下来3个位机器ID,接下来2个为mongodb服务的进程id,最后为自增数据、

查询数据

db.tableName.find(where, fileds)

where:查询条件,可选
fileds获取指定的列, 可选

操作 格式 范例 关系型数据库中的类似语句
等于 {<key>:<value>} db.col.find({"by":"书生"}).pretty() where by = '书生'
小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

注:使用pretty()可以让查询到的数据以更好看的形式展现。

例1:

db.member.find({name:'baba'})

查询name='baba'的记录

例2:

db.member.find({name:'baba',age:30})

查询name='baba'并且age=30的记录

例3:

db.member.find({age:{$lt:26}})

查询age小于26的记录

例4:

db.member.find({age:{$lt:26, $gt:20}})

查询age大于20小于26的记录

例5:(投影操作)

db.user.find({},{name: 1, _id: 0 })

查询所有的数据,只获取name列的值。name的值为1表示获取该列的值,为0表示不获取该列的值。

附:以格式化后的结构展示查询结果

db.tableName.find(where).pretty()

删除数据

db.member.remove(where,justOne)

where:删除的条件表达式
justOne:当符合条件的文档有多条时,为true只删除一条记录,为false表示全部删除,默认为false

更新数据

基本语法

db.tableName.update(where, data, upsert, multi)

where:条件表达式(更新的条件)
data:要更新的数据
upsert:为true时,表示如果根据查询条件表达式找不到记录,则将准备更新的数据插入到表中作为一条新记录,默认为false
multi:默认为false,表示只更新符合条件的一条记录,如果为true时,表示更新所有的符合条件的记录,该参数必须在含有$操作下才生效

例子的数据准备:

db.member.insert({name: 'baba', age: 30, sex: '男', 'money': 999999999})

默认情况下,update会覆盖整个文档(整条记录内容)

例1:

db.member.update({name: 'baba'},{'money': 99999999998})

执行完上面的操作,整条记录会变成:{'money': 99999999998}

只更改部分字段值

db.tableName.update(条件表达式, {$set: 修改的内容})

$set 可以指定修改某些字段(键)

例2:

db.member.update({name: 'baba'}, {$set: {'money': 99999999998}})

执行完上面的操作,整条记录会变成:{name: 'baba', age: 30, sex: '男', 'money': 99999999998}

例3:第三个参数的使用例子

db.member.update({name: 'bingbing'}, {name: 'libingbing', age: 40}, true)

如果根据{name: 'bingbing'}找不到符合条件的记录,则将{name: 'libingbing', age: 40}插入到数据表中作为一条新记录。

例4:第四个参数的使用例子

正确使用方法:

db.member.update({name: '小锅'}, {$set: {name: '火锅', age: 3}}, false, true)

错误使用方法:

db.member.update({name: '小锅'}, {name: '火锅', age: 3}, false, true)

更多查询条件

逻辑运算符的使用

AND查询:在Json中直接编写多个条件即可。

# 查询name为baba 并且 age等于30的
db.member.find({name: 'baba', age: 30})

OR 查询:值应该是一个数据,使用$or标记

# 查询name为baba 或者 age等于30的
db.member.find({$or: [{name: 'baba', age: 30}]})
# 查询 (name为baba 或者 age等于30) 并且性别为1的
db.member.find({$or: [{name: 'baba', age: 30}], sex: 1})
范围运算符 $in$nin

判断是否在某个范围

db.member.find({age: {$in: [20, 22, 24]}})
正则条件 使用定界符 //或者$regex
db.member.find({name: {$regex: '^ond+'}})

db.member.find({name: /^ond+/})
自定义查询 $where

可以直接使用js编写条件语句。

db.member.find({ $where: function(){
        # this 指当前记录, 即每一条记录。查询会扫描整个表中的所有数据
        return this.age > 20;
    } 
})

读取指定数量的文档

会用到limit()skip()

limit(n):获取指定数量的文档

skip(n):跳过指定数量的文档

db.member.find({age: 20}).limit(3)

db.member.find({age: 20}).skip(1)

db.member.find({age: 20}).limit(3).skip(1)

db.member.find({age: 20}).skip(1).limit(3)

排序 sort()

db.member.find().sort({age: -1, sex: 1})

统计 count()

db.member.find().count()
db.member.find({条件})count()
db.member.count()
db.member.count({条件})

去重 distinct()

# 去重字段要被引号包着
db.member.distinct("去重字段")

db.member.distinct("去重字段", {条件})

聚合操作 aggregate()

mongodb的聚合操作是基于管道来处理的。文档可以多个处理过程(stage),各个过程之间由管道相连,每一步处理的结果会是下一步处理的输入值。类似于流水线处理。

基本语法:

db.表名称.aggregate({管道: {处理表达式}})

常用管道有:

管道名称 说明
$group 分组操作
$match 过滤
$project 修改文档结构,如:重命名、增加、删除字段等
$sort 排序后输出
$limit 限制条数
$skip 跳过文档
$unwind 将数组类型的列进行拆分

常用处理表达式有:

表达式名称 说明
$sum 求和
$avg 求平均值
$min 求最小值
$max 求最大值
$push 在结果文档中插入值到一个数组中
$first 获取一个文档数据
$last 获取最后一个文档数据

Python操作MongoDB

pip3 install pymongo

https://blog.csdn.net/adley_app/article/details/80715630

https://www.cnblogs.com/zhangxinqi/p/9242687.html

设置用户和密码

开启认证

mongod --auth  # 启用认证

创建管理员用户

use admin

db.createUser({user:"admin",pwd:"password",roles:["root"]})

admin(用户名)password(密码)root(超级账号)

内建角色

Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限

认证登录

db.auth("用户名", "密码")

MongoDB role 类型

数据库用户角色(Database User Roles)
    read:授予User只读数据的权限
    readWrite:授予User读写数据的权限

数据库管理角色(Database Administration Roles):
    dbAdmin:在当前dB中执行管理操作
    dbOwner:在当前DB中执行任意操作
    userAdmin:在当前DB中管理User

备份和还原角色(Backup and Restoration Roles):
    backup
    restore

跨库角色(All-Database Roles):
    readAnyDatabase:授予在所有数据库上读取数据的权限
    readWriteAnyDatabase:授予在所有数据库上读写数据的权限
    userAdminAnyDatabase:授予在所有数据库上管理User的权限
    dbAdminAnyDatabase:授予管理所有数据库的权限

集群管理角色(Cluster Administration Roles):
    clusterAdmin:授予管理集群的最高权限
    clusterManager:授予管理和监控集群的权限,A user with this role can access the config and local databases, which are used in sharding and replication, respectively.
    clusterMonitor:授予监控集群的权限,对监控工具具有readonly的权限
    hostManager:管理Server

添加数据库用户

use 数据库名

db.createUser({user: "flowpp", pwd: "flopww", roles: [{ role: "dbOwner", db: "flowpp" }]}) 

# 创建用户flowpp,设置密码flopww,设置角色dbOwner

查看系统用户

use admin

db.system.users.find()  # 显示当前系统用户

删除用户

注:删除用户的时候需要切换到用户管理的数据库才可以删除
use admin

switched to db admin

db.dropUser("flowpp")

false

2.切换flowpp ,删除用户flowpp,删除成功

use flowpp

switched to db flowpp

db.dropUser("flowpp")

true
原文地址:https://www.cnblogs.com/imxiaoqi/p/10479075.html