MongoDB基础使用

MongoDB:是一个基于分布式文件存储的非关系数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB的查询语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

NoSQL:指非关系型数据库,有的文档称作Not Only SQL的缩写,是对不同于传统的关系型数据库管理系统的统称。适用于超大规模数据的存储。

NoSQL特点

1.没有声明性查询语言
2.没有预定义的模式
3.key-value形式的键值对存储、列存储、文档存储、图形数据库
4.最终一致性,非ACID属性
5.CAP定理
6.高性能、高可用性、可伸缩性

CAP定理:一个分布式系统不可能同时很好的满足 一致性、可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

一致性(Consistency):所有节点在同一时间具有相同的数据  
可用性(Availability):保证每个请求不管成功或者失败都有响应  
分区容错性(Partition tolerance):系统中任意信息的丢失或失败不会影响系统的继续运行  

只能同时满足上面三点中的两点,也就是说有CA、CP和AP三种类型的搭配。

分布式系统:(distributed system)是建立在网络之上的软件系统。所以分布式系统具有高度的内聚性和透明性。

BASE:BASE是对CAP原理中一致性( C )和可用性(A)权衡的结果。即:即使无法做到强一致性,但是可以根据业务特点,采用适当的方式使系统达到最终一致性。
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写

MongoDB下载:下载链接为:https://www.mongodb.com/download-center/community ,若该链接不可用,可去https://www.mongodb.com/ 寻找最新的下载地址。如下图所示:下载地址有不同平台和版本可供选择,选择自己所需版本下载即可。这里我下载的是适用于Mac平台的4.0.12版本。对于Mac平台:从 MongoDB 3.0 版本开始只支持 OS X 10.7 (Lion) 版本及更新的mac版本系统(下载时要注意自己的mac系统版本和MongoDB版本的兼容性)。
MongoDB基础使用
为了方便我用curl命令下载:

1.进入/usr/local/
cd /usr/local/
2.用curl命令下载
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.12.tgz
3.解压下载下来的MongoDB包
sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.12.tgz
4.将解压出来的目录重命名为 mongodb
sudo mv mongodb-osx-x86_64-4.0.12 mongodb

MongoDB配置

1.进入 /usr/local/mongodb/ 目录
cd /usr/local/mongodb/
2.创建一个数据库存储目录
sudo mkdir data/db
3.创建一个log作为日志文件目录
sudo mkdir -p log
4.创建一个log/mongo.log日志文件
sudo touch log/mongo.log
5.创建一个 etc 目录作为MongoDB配置文件的目录
sudo mkdir etc
6.创建配置文件etc/mongo.conf
sudo touch etc/mongo.conf
7.修改 etc/mongo.conf权限
sudo chmod 777 etc/mongo.conf
8.将下列项写入配置文件 etc/mongo.conf
logpath=/usr/local/mongodb/mongo.log
logappend=true
dbpath=/usr/local/mongodb/data/db
fork=true
port=27017

上面的 fork=true 只在linux平台下有效,意思是以守护进程的方式在后台运行。

运行MongoDB

1.进入 /usr/local/mongodb/bin/ 目录
cd /usr/local/mongodb/bin/
2.运行MongoDB
sudo ./mongod --config /usr/local/mongodb/etc/mongo.conf
3.进入MongoDB
./mongo

使用MongoDB:
查看所有数据库,使用 show dbs

show dbs

切换/创建数据库: use DATABASE_NAME

use food

创建集合

db.createCollection("students")

删除数据库用 db.dropDatabase()

db.dropDatabase()

MongoDB其他常用命令见另一篇博客MongoDB常用命令

关闭MongoDB服务

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> use admin
switched to db admin
> db.shutdownServer()
2019-09-09T00:32:05.661+0800 I NETWORK  [js] DBClientConnection failed to receive message from 127.0.0.1:27017 - HostUnreachable: Connection closed by peer
server should be down...
2019-09-09T00:32:05.663+0800 I NETWORK  [js] trying reconnect to 127.0.0.1:27017 failed
2019-09-09T00:32:05.664+0800 I NETWORK  [js] reconnect 127.0.0.1:27017 failed failed 
> exit
bye

Python操作MongoDB
Python要连接MongoDB,需要MongoDB驱动,使用pymongo驱动来连接。我自己环境Python版本为3.7.
安装pymongo:

pip3 install pymongo

然后创建一个python脚本文件:mongo_test.py

#!/usr/bin/python3

import pymongo


def test_mongo():
    # 获取数据库连接
    test_client = pymongo.MongoClient("127.0.0.1", 27017)

    # 获取MongoDB中所有的数据库
    db_list = test_client.list_database_names()

    # 获取数据库(如果没有则会创建一个数据库)
    test_db = test_client["hduedu"]

    # 获取所有的集合
    col_list = test_db.list_collection_names()

    # 获取集合(如果没有则会新建一个集合)
    test_col = test_db["teacher"]

    # 向集合中插入数据
    # 插入一个文档用:insert_one(document),这里document是一个字典
    # 插入多个文档用:insert_many(document),这里document是一个字典列表
    document01 = {"name": "tony", "age": 36}
    test_col.insert_one(document01)

    # 查询集合中的数据
    # 查询一条数据用:find_one()
    one_data = test_col.find_one()

    # 查询集合中所有数据用:find()
    all_data = test_col.find()

    # 有条件的查询用:find("查询条件")
    # 查询指定字段的数据:1表示返回,0表示不返回
    cond_data = test_col.find({}, {"_id":0, "name":1})

    # 查询name=tom的数据
    tom_data = test_col.find({"name": "tom"})

    # 查询年龄小于35岁的数据
    data35 = test_col.find({"age": {"$lt": 35}})

    # 查询name字段中以m结尾的数据
    data_m = test_col.find({"name": {"$regex": "m$"}})

    # 只查询3条数据记录
    data_3 = test_col.find().limit(3)
    
    # 修改数据
    # 修改一条数据用:update_one()
    my_query = {"name": "tony"}
    new_value = {"$set": {"age": 44}}
    test_col.update_one(my_query, new_value)

    # 修改多条数据用:update_many()
    test_col.update_one(my_query, new_value)

    # 查询结果排序用:sort(字段,规则) 1升序,-1降序
    test_col.find().sort("age", 1) 
    test_col.find().sort("age", -1)

    # 删除数据
    # 删除一条数据用: delete_one()
    test_col.delete_one({"name": "tony"})

    # 删除多条数据用:delete_many()
    test_col.delete_many({"name": {"$regex": "ny$"}})

    # 删除集合中所有数据
    test_col.delete_many({})
    
    # 删除集合
    test_col.drop()   


if __name__ == '__main__':
    test_mongo()

mongoengine:是一个对象文档映射器(ODM-Object Document Mapping)。mongoengine是基于pymongo的。mongoengine用起来就相当于一个基于SQL的对象关系映射器(ORM-Object Relational Mapping)。
安装mongoengine

pip3 install mongoengine

创建一个Python脚本:mongoengine_test.py

#!/usr/bin/python3

import mongoengine


# 连接数据库
mongoengine.connect("hduedu", host="127.0.0.1", port=27017)

class Teacher(mongoengine.Document):
    name = mongoengine.StringField(required=True)
    age = mongoengine.IntField(required=True)


if __name__ == '__main__':
    # 往集合中增加数据
    teacher01 = Teacher()
    teacher01.name = "andy"
    teacher01.age = "12"
    teacher01.save()

    # 删除name=tony的数据
    teacher02 = Teacher.objects(name="tony")
    teacher02.delete()

    # 将集合中age=12的数据的name修改为jane
    # 修改的方法有:update_one() update()
    teacher03 = Teacher.objects(age=12).update_one(set__name="jane")

    # 获取集合中所有数据
    # 查询方法有:all() first() filter()
    all_teachers = Teacher.objects.all()
    for teacher in all_teachers:
        print("name:{0}, age:{1}".format(teacher.name, teacher.age))

简单用法如上,为了方便维护代码,使用mongoengine时可使用MVC来写代码。

上一篇:Linux搭建MongoDB分片集群


下一篇:mongodb的docker-compose.yml