说在前面
虽然汉语是母语,理解起来比较快速。但是有时候有些常用词没有必要翻译,翻译了反而造成不必要的麻烦,mongodb 里面的关键性的术语,我都不会翻译,直接用英文。写成全英文,不是不可以,只是始终读起来反应速度要比读中文慢一点,即使是我自己写的英文。
基本概念
mongo 是文档型数据库,其数据结构都是 field + value 的键值对的形式。外形类似于 JSON,但其实是 BSON 格式(也就是二进制的 JSON,其中,BSON 的字符串采用 UTF-8 编码)。 一个 BSON document 所有的 BSON document 被存放在 collection 里。然后 collection 放在数据库里。 一个 collection
运行 mongo,进入交互界面。首先在命令行里熟悉一下:
help;
show dbs; # 显示所有数据库
use db_name; # 切换或者创建数据库
# 再次 show dbs 不会显示这个新数据库,需要插入数据才行
插入数据前,先建立 collection。
db.createCollection('staff')
插入单条的 document:
db.staff.insertOne({'name': 'Sue', 'age': 29})
插入多条 ducuments:
db.staff.insertMany([
{'name': 'Eloisa', 'age':27},
{'name': 'Brandy', 'age':26},
{'name': 'Dora', 'age': 24, 'gender': 'female'}
])
值得一提的是,就算突然多加入了一个 field 也不会对原有数据造成影响。
这是查找 Dora 这条数据的两个方法。
db.staff.find({'name':'Dora'})
db.staff.find({'gender':'female'})
唯一索引
作用就是防止添加含有重复的键的数据到数据库。例如确保 collection "lagou_items" 的键 "positionId" 保持唯一。只看键是否重复,不看值。
db.lagou_items.createIndex({'postionId': 1}, {'unique': true})
db.lagou_items.insertOne({'positionId': 666}) # 正常
db.lagou_items.insertOne({'positionId': 888}) # 报错 E11000 duplicate key error collection
PyMongo
和本地的 mongo 数据库连接。
from pymongo import MongoClient
client = MongoClient()
client.database_names() # 返回现有的数据库
# ['admin', 'config', 'local', 'weng']
db = client.weng # weng 是一个 db 的名字
插入数据。和 mongo 本身的写法非常相似,但是 insert_one 的命名方式延续了 Python 的风格。注意这里插入的不是 JSON 或 BSON,而是 dict 对象。
db.jobs.insert_one({'Michael': 25}) # 返回
新插入的数据默认情况下自带一个 _id 字段。我先来试着搜一下刚刚放进去的数据:
>>> db.staff.find_one()
{'_id': ObjectId('5b05602efc68c46bb1aa61e9'), 'age': 29.0, 'name': 'Sue'}
>>> db.staff.find_one({'name':'brandy'})
>>> db.staff.find_one({'name':'Brandy'})
{'_id': ObjectId('5b0560d1fc68c46bb1aa61eb'), 'age': 26.0, 'name': 'Brandy'}
从上面可以看出,find_one 无参数时返回整个 collection 的第一项。查询的时候是区分大小写的。
以上都是最最基础的几条命令,学会了之后继续拓展只是一个查文档+重复+记忆的过程了。此外,还有必要刻意比较一下 sql 和 nosql 数据库的差异。来日却来理会。
Until then,
Happy hacking!
网友评论