mongodb学习使用记录

Posted by Kody Black on January 25, 2024

基础知识

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()

基本操作就这样了,速成完事!