最近接触到了Mongo数据库,只会简单的写入和读取操作,不过在大部分场景也够用了,这里做下记录。
注:本文基于Python和Robo 3T 对Mongo数据库进行操作
一、MongoDB 简介
MongoDB中的值存储格式类似于Json对象,多个值组成和,多个集合组成数据库。
MongoDB中存在以下系统数据库:
- Admin数据库:一个权限数据库,如果创建用户的时候将该用户添加到admin数据库中,那么该用户就自动继承了所有数据库的权限
- Local数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合
- Config数据库:当MongoDB使用分片模式时,config数据库在内部使用,用于保存分片的信息。
一个MongoDB实例可以包含一组Database(数据库),一个 DataBase包含多个Collection(集合),集合中由多个文档组成,文档则是由字段和值对组成的数据结构,类似于JSON对象。
注:这里的 _id 是写入数据时自动生成的
二、在Robo 3T 中的使用
Robo 3T是一个MongoDB的可视化工具,便于查看一个mongodg实例里有哪些数据库,数据库里有哪些集合、文档等,还可以进行增删改查的操作。
1、Robo 3T 安装
Robo 3T 安装链接:https://robomongo.org/
2、Robo 3T 连接mongodb实例
在没有连接任何实例的情况下,下面的内容为空,点击 create 连接已经存在的实例(Robo 3T 只是一个可视化工具,不能创建新的服务器)
输入服务器的名称Name和地址 Address,外网端口默认为27017,内网则有所不同
3、Robo 3T 简单操作
连接成功后,点开是这样的界面,一个柱状体是一个Database
一个数据库下面自动生成下面三个文件夹,数据一般都是存在第一个文件夹 Collections 中,剩下两个文件我还不知道用途。
写入一个新的集合之后,需要点击 Refresh 更新,否则可能会看不到新写入的集合
Collections 下面有多个表格
注意:谨慎进行集合删除操作!!!
在上面这一行控制栏可以输入操作语句,键入 ctrl + Enter 运行出结果,这里 count 是计算文档的数目
更多操作语句详细参考下面这个教程:
《robomongo(robo3T)操作MongoDB数据库常用命令》
4、不同数据库之间复制集合
db.trans.find().forEach(function(d){db.getSiblingDB('practice')['test'].insert(d);});
‘trans’ 是需要被复制的 collection,‘practice’ 是目标数据库,‘test’ 是复制得到的collection(被命名为 test)
第一次复制的时候出现了错误:
这里默认设置了最多运行时间为15秒,我的理解是,这是一个快速报错机制,可以比较快的反映错误。不过一旦需要复制的文档量过大,也会超时,只需要修改运行时间即可:
将时间修改得大一些就可以了
5、不同实例之间复制集合
这个没有查到很好的直接在Robo 3T 上的操作,可以在python上,先把源数据集从数据库中读出来,再一条条插入到目的数据集当中。
三、基于Python使用MongoDB
本文的代码在 Pycharm上实现
- 导入第三方库
import pymongo
- 使用PyMongo的第一步是为正在运行的mongod实例创建一个MongoClient
from pymongo import MongoClient
client = MongoClient()
上述的代码是连接默认的host和端口,我们也可以选择特定的host和端口,如下:
client = MongoClient('localhost',27017)
或者使用 MongoDB 的 URL 形式:
client = MongoClient('mongodb://localhost:27017/')
- 获得数据库 (Database)
db = client.test_database
# 或者
db = client['test_database']
有些实例需要输入账号和密码才能获得使用权限
db = client.admin
db.authenticate('xxx_1', 'xxx_2')
xxx_1 是 Name(注意不是 user name),xxx_2 是 password
- 获得集合 (Collection)
collection = db.test_collection
# 或者
collection = db['test_collection']
- 插入文档 (Document)
使用 insert_one 可以插入文档
post = {
'name':'xiao',
'age':20
}
collection.insert_one(post)
插入文档时,如果文档未包含"_id"键,则会自动添加一个特殊的 “_id” 。"_id" 值在整个集合中必须是惟一的。
- 查找文档
find_one
print(collection.find_one({"name":"xiao"}))
参考资源
MongoDB中文手册|官方文档中文版
Mongdb之Robo3T
robomongo(robo3T)操作MongoDB数据库常用命令