基础知识
MongoDB 属于nosql,即非关系型数据库,关系型数据库遵循ACID原则(atomicity,consisitency,isolation,durability) NoSql遵循BASE原则(Basically Available,Soft-state,Eventually Consistency)
MongoDB 是一种使用文档存储的NoSql数据库,MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
用户权限配置
在实际项目中,发现登录用户无法成功进行show dbs
,会报错无权限。
关于具体的权限关系,参考mongodb用户权限管理最全攻略
主要是配置文件的问题,配置文件如下
root@debian:~# cat /etc/mongod.conf
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
#dbPath: /var/lib/mongodb
dbPath: /mnt/sd1/var/lib/mongo
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
#path: /var/log/mongo_old/mongod.log
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongod.pid # location of pidfile
security:
authorization: enabled # 这里要求了需要授权访问
replication:
replSetName: rs0
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#setParameter:
# internalQueryExecMaxBlockingSortBytes:335544320
#snmp:
由于觉得有个root用户还是比较方便,所以修改配置文件,将security的这两行配置注释掉。
然后重启mongod:
root@debian:/home/kody/test_spiders# ps -ef | grep mongod
root 2299 1 1 Jan20 ? 01:24:10 mongod -f /etc/mongod.conf
root 129738 129526 0 06:57 pts/14 00:00:00 grep mongod
root@debian:/home/kody/test_spiders# kill 2299
root@debian:/home/kody/test_spiders# mongod -f /etc/mongod.conf
打开Mongo,新建一个超级管理员用户,注意,这个用户权限只是针对admin数据库,可以用来管理所有的用户。
rs0:PRIMARY> use admin
switched to db admin
rs0:PRIMARY> db.createUser({
... user: "root",
... pwd:"password",
... roles:[{ role: "userAdminAnyDatabase", db: "admin" }]
... })
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
之后再把配置文件改回去,这样下次需要统一管理时直接用root用户即可
rs0:PRIMARY> use admin
switched to db admin
rs0:PRIMARY> db.auth("root","password")
1
rs0:PRIMARY> show dbs
admin 0.000GB
基本的使用
首先,我们要创建一个用来管理目标数据库的用户:
use admin
db.auth("root","password")
use temp
db.createUser(
{
user: "alice",
pwd: "alice",
roles: [ { role: "readWrite", db: "temp" } ]
}
)
上述操作后,我们创建了一个用户alice,可以用来读写temp数据库。下面是使用python进行了基本的增删改查。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import pymongo
# 连接数据库
# 用户名: alice
# 密码: alice
client = pymongo.MongoClient('mongodb://alice:alice@localhost:27017/temp')
# 选择数据库为temp
db = client['temp']
# 在集合temp_collection中插入数据
db['temp_collection'].insert_one({'name': 'bob', 'age': 18})
db['temp_collection'].insert_one({'name': 'wade', 'age': 33})
db['temp_collection'].insert_one({'name': 'alice', 'age': 20})
# 创建索引
db['temp_collection'].create_index([('name', pymongo.ASCENDING)])
# 查询数据
print("check data")
for item in db['temp_collection'].find():
print(item)
# 更新数据
db['temp_collection'].update_one({'name': 'bob'}, {'$set': {'age': 21}})
# 按照年龄排序
print("check sort data")
for item in db['temp_collection'].find().sort('age', pymongo.ASCENDING):
print(item)
# 删除数据
# db['temp_collection'].delete_one({'name': 'bob'})
# 删除全部内容
db['temp_collection'].delete_many({})
# 删除temp_collection集合
# db['temp_collection'].drop()
# 关闭连接
client.close()
基本操作就这样了,速成完事!