一、前言

MongoDB属于 NoSQL(非关系型数据库),是一个基于分布式文件存储的开源数据库系统。

二、操作 MongoDB

1、安装 pymongo

python 使用第三方库来连接操作 MongoDB,所以我们首先安装此库。

pip install pymongodb

2、连接 MongoDB

使用 MongoClient 类连接,以下两种参数方式都可以:

  1. from pymongo import MongoClient
  2. # 连接方式一
  3. client = MongoClient(host='localhost',port=27017)
  4. # 连接方式二
  5. # client = MongoClient('mongodb://localhost:27017/')

3、选择数据库

MongoDB 可以创建很多 db,指定我们需要的 db 即可

  1. # 方式一
  2. db = client.Monitor
  3. # 方式二
  4. # db = client['Monitor']

4、选择集合

db 内包含很多个集合,有点类似 mysql 这类关系型数据库中的表

  1. # 方式一
  2. collection = db.test
  3. # 方式二
  4. # collection = db['test']

5、插入数据

插入一条数据,MongoDB 每条记录都有一个唯一标识。返回一个 InsertOneResult 对象,若需要获取唯一标识,找到 InsertOneResult 对象的属性 inserted_id 即可

  1. from pymongo import MongoClient
  2. class mongodb:
  3. def __init__(self,host,db,port = 27017):
  4. '''
  5. :param host: str mongodb地址
  6. :param db: str 数据库
  7. :param port: int 端口,默认为27017
  8. '''
  9. host = host
  10. db = db
  11. self.port = port
  12. client = MongoClient(host=host,port=port)
  13. self.db = client[db]
  14. def insert_one(self,table,dic):
  15. '''
  16. :param table: str 数据库中的集合
  17. :param dic: dict 要插入的字典
  18. :return: 返回一个包含ObjectId类型的对象
  19. '''
  20. collection = self.db[table]
  21. rep = collection.insert_one(dic)
  22. return repif __name__=='__main__':
  23. dic = {'姓名':'小明','English':100,'math':90}
  24. db = mongodb(host='localhost',db = 'test')
  25. rep = db.insert_one('test',dic)
  26. print(rep.inserted_id)

插入多条数据,使用 insert_many 批量插入

  1. from pymongo import MongoClient
  2. class mongodb:
  3. def __init__(self,host,db,port = 27017):
  4. '''
  5. :param host: str mongodb地址
  6. :param db: str 数据库
  7. :param port: int 端口,默认为27017
  8. '''
  9. host = host
  10. db = db
  11. self.port = port
  12. client = MongoClient(host=host,port=port)
  13. self.db = client[db]
  14. def insert_one(self,table,dic):
  15. '''
  16. :param table: str 数据库中的集合
  17. :param dic: dict 要插入的字典
  18. :return: 返回包含一个ObjectId类型的对象
  19. '''
  20. collection = self.db[table]
  21. rep = collection.insert_one(dic)
  22. return rep
  23. def insert_many(self,table,lists):
  24. '''
  25. :param table: str 数据库中的集合
  26. :param dic: dict 要插入的列表,列表中的元素为字典
  27. :return: 返回包含多个ObjectId类型的列表对象
  28. '''
  29. collection = self.db[table]
  30. rep = collection.insert_many(lists)
  31. return rep
  32. if __name__=='__main__':
  33. lists = [{'姓名':'小明','English':100,'math':90},
  34. {'姓名':'小华','English':90,'math':100}]
  35. db = mongodb(host='localhost',db = 'test')
  36. rep = db.insert_many('test',lists)
  37. for i in rep.inserted_ids:
  38. print(i)

6、查询

1)常规查询

  • find_one :查询单条记录,返回一个字典。
  • find:查询多条记录 ,返回一个游标对象。 ```python from pymongo import MongoClient

class mongodb: def init(self,host,db,port = 27017): ‘’’ :param host: str mongodb地址 :param db: str 数据库 :param port: int 端口,默认为27017 ‘’’ host = host db = db self.port = port client = MongoClient(host=host,port=port) self.db = client[db]

  1. def find_one(self,table,dic):
  2. '''
  3. :param table: str 数据库中的集合
  4. :param dic: dict 查询条件
  5. :return: dict 返回单条记录的字典
  6. '''
  7. collection = self.db[table]
  8. rep = collection.find_one(dic)
  9. return rep
  10. def find(self,table,dic):
  11. '''
  12. :param table: str 数据库中的集合
  13. :param dic: dict 查询条件
  14. :return: list 返回查询到记录的列表
  15. '''
  16. collection = self.db[table]
  17. rep = list(collection.find(dic))
  18. return rep

if name==’main‘:

# 查询 English 成绩为 100 的所有记录
dic = {'English':100}
db = mongodb(host='localhost',db = 'test')
rep = db.find('test',dic)
print(rep)
2)范围查询<br />有时候我们需要范围比较查询,比如要查询 English 成绩为 80~90 ,可以使用比较符:dic = {'English':{'$in':[80,90]}}

- $lt :小于
- $lte:小于等于
- $gt:大于
- $gte:大于等于
- $ne:不等于
- $in:在范围内
- $nin:不在范围内

3)模糊查询<br />如果想要类似这种 sql 语句查询: select * from db where name like '%abc%'。在 MongoDB 中可以通过正则表达式来实现
```python
# 模糊搜索key为"姓名",value包含"明"的记录
dic = {'姓名':{'$regex':'明'}}
rep = list(collection.find(dic))

4)字段筛选
如果只想返回指定的字段,使用 find(find_one)方法时加上 projection 参数。类似 sql 语法:select Englist from db where name like ‘%abc%’

# projection字典参数。1显示,0不显示
# 以下查询结果只返回key为English的相关字段
rep = list(collection.find(dic,projection={'English':1,'_id':0}))

5)计数
直接调用 count() 方法,返回一个 int 类型的数字

# 计数查询只需要在普通查询后加上 count() 即可
count = collection.find().count()  
# count = collection.find({'English':{'$gt':90}}).count()

6)排序
排序时,直接调用sort()方法,并在其中传入排序的字段及升降序标志,返回一个游标对象

# 正序 ASCENDING,倒序 DESCENDING。list()将游标对象转成列表
data = list(collection.find(dic).sort('姓名',pymongo.DESCENDING))

7、更新数据

首选查到需要更新的数据,然后将该数据更新,返回一个 UpdataResult 对象, raw_result 属性中包含 update 生效的个数。

  • update_one:更新查询到的第一条数据
  • update_many:更新多条数据 ```python from pymongo import MongoClient

class mongodb: def init(self,host,db,port = 27017): ‘’’ :param host: str mongodb地址 :param db: str 数据库 :param port: int 端口,默认为27017 ‘’’ host = host db = db self.port = port client = MongoClient(host=host,port=port) self.db = client[db]

def update_one(self,table,condition,dic):
    '''
    :param table: str 数据库中的集合
    :param condition: dict 查询条件
    :param dic: dict 更新的数据
    :return: 返回UpdateResult对象
    '''
    collection = self.db[table]
    # $set 表示只更新dic字典内存在的字段
    rep = collection.update_one(condition,{'$set':dic})
    # 会把之前的数据全部用dic字典替换,如果原本存在其他字段,则会被删除
    # rep = collection.update_one(condition, dic)

    return rep

def update_many(self,table,condition,dic):
    '''
    :param table: str 数据库中的集合
    :param condition: dict 查询条件
    :param dic: dict 更新的数据
    :return:返回UpdateResult对象
    '''
    collection = self.db[table]
    # $set 表示只更新dic字典内存在的字段
    rep = collection.update_many(condition,{'$set':dic})
    # 会把之前的数据全部用dic字典替换,如果原本存在其他字段,则会被删除
    # rep = collection.update_many(condition, dic)

    return rep

if name==’main‘: condition = {‘English’:80} dic = {‘English’:60} db = mongodb(host=’mongodb-monitor.monitor.svc.test.local’,db = ‘test’) rep = db.update_one(‘test’,condition,dic) print(rep.raw_result)

# 输出 {'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}
<a name="wKyOK"></a>
#### 8、删除
删除和 update 类似,删除数据后,返回一个 DeleteResult 对象, raw_result 属性中包含 delete 的个数

- delete_one:删除查询到的第一条数据
- delete_many:批量删除符合查询条件的数据
```python
from pymongo import MongoClient

class mongodb:
    def __init__(self,host,db,port = 27017):
        '''
        :param host: str mongodb地址
        :param db: str 数据库
        :param port: int 端口,默认为27017
        '''
        host = host
        db = db
        self.port = port
        client = MongoClient(host=host,port=port)
        self.db = client[db]

    def delete_one(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: 返回DeleteResult对象
        '''
        collection = self.db[table]
        rep = collection.delete_one(dic)

        return rep

    def delete_many(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: 返回DeleteResult对象
        '''
        collection = self.db[table]
        rep = collection.delete_many(dic)

        return rep


if __name__=='__main__':
    dic = {'English':60}
    db = mongodb(host='localhost',db = 'test')
    rep = db.delete_many('test',dic)
    print(rep.raw_result)
    # 输出 {'n': 21, 'ok': 1.0}