#!/usr/bin/env python
# coding=utf-8
import pymongo
from pymongo import MongoClient
from pymongo.errors import DuplicateKeyError
# 1. 导入MongoClient
# 首先,需要一个类,把对数据库的增删改查操作封装为一个接口
# 该类的名名字随便期
class Mongo(object):
# 初始化,就是连接数据库
# port:必须是个整数,不能加引号变成字符串
def __init__(self, host='127.0.0.1', port=47017):
self.client = MongoClient(host, port)
# 插入数据
def insert(self, database, collection, document):
"""
:param database: 表示哪个数据库
:param collection: 表示哪个表
:param document: 表示哪个记录
:return:
"""
# 1. 连接数据库
_database = self.client.get_database(database)
# 2.连接该库下面要操作的表
_collection = _database.get_collection(collection)
# 给表里插入一条数据
result = _collection.insert_one(document)
# 插入数据后,返回的是什么数据类型?数据是什么?下面打印出来看看
# print(type(result)) # <class 'pymongo.results.InsertOneResult'>
# print(dir(result))
# print(result) # <pymongo.results.InsertOneResult object at 0x033A4DF0>
# print(result.inserted_id) # 插入成功后返回的一个id
# print(result.acknowledged) # 判断有没有插入成功,成功True,失败:False
def insert(self, database, collection, document):
try:
_database = self.client.get_database(database)
_collection = _database.get_collection(collection)
# 如果document 是个字典,说明就是一个值,就可以用insert_one()
# isinstance:是python里的函数,判断一个对象是个个字典,还是个列表
if isinstance(document, dict):
result = _collection.insert_one(document)
# 如果插入成功就返回一个result.acknowledged
return result.acknowledged
elif isinstance(document, list):
result = _collection.insert_many(document)
return result.acknowledged
else:
return False
except DuplicateKeyError:
return False
# def search(self, database, collection, filter):
# """
# :param database: 数据库
# :param collection: 表
# :param filter: 查询条件,查询条件必须是个字典
# :return:
# """
# # 同理:先获取数据库
# # 再得到表
# # 最后就可以用该表去查找了
# _database = self.client.get_database(database)
# _collection = _database.get_collection(collection)
# # 把查询结果转化成列表
# results = list(_collection.find(filter))
# print(type(results)) # <class 'pymongo.cursor.Cursor'>
# print(dir(results))
# print(results)
# # 将查询结果return
# return results
def search(self, database, collection, filter):
"""
:param database: 数据库
:param collection: 表
:param filter: 查询条件,查询条件必须是个字典
:return:
"""
# 同理:先获取数据库
# 再得到表
# 最后就可以用该表去查找了
_database = self.client.get_database(database)
_collection = _database.get_collection(collection)
# 把查询结果转化成列表
results = list(_collection.find(filter))
# print(type(results)) # <class 'pymongo.cursor.Cursor'>
# print(dir(results))
print(results)
# 将查询结果return
return results
def delete(self, database, collection, filter):
# filter: 删除的条件
_database = self.client.get_database(database)
_collection = _database.get_collection(collection)
result = _collection.delete_many(filter)
# print(result.acknowledged)
return result.acknowledged
def update(self, database, collection, filter, document_to):
_database = self.client.get_database(database)
_collection = _database.get_collection(collection)
# filiter: 更新的条件
# update:第二个参数:即是否要更新的数据。即用update去更新那些符合filter条件的数据
# 更新的操作:要更新的数据,首先是个字典,字典里面的格式为:{"$set":要更新的内容}
result = _collection.update_many(filter, {"$set": document_to}, upsert=True)
def __del__(self):
self.client.close()
if __name__ == '__main__':
mongo = Mongo()
for i in range(1,40):
data = {'_id': i,"name": '香蕉',"age": 25}
# 如果指定了插入时的id值,就会用你指定的值,如果没有指定id值,插入后就会自动有个ObjectId("5bb9bc6aa236ce29f4898035")
# 插入数据
# 'trade_center':要插入的库,如果不存在,mongoDB会自动帮你创建这个库
# 'users':表,如果不存在,MongoDB会自动帮你创建表
# data: 要插入到 trade_center库下面的users表里的数据
mongo.insert('mydb', 'mongod2', data)
# 定义查询条件,查询条件必须是个字典
# 像下面的写法,是and的关系
# filter = {"name": "橙子" } #注意:查询条件里,如果值是int等类型时,不能加“”,否则就会查不到数据,同理,删除/更新也是一样的
# mongo.search('mydb', 'mongod', filter)
# # 删除的条件,如果值是整数,不能加引号
# filter = {"name": "草莓" }
# mongo.delete('mydb', 'mongod', filter)
#filter:条件
# filter = {"name": "橙子"}
# #要更新成的数据
# document_to = {"name": "草莓","age": 10}
# mongo.update('mydb', 'mongod', filter, document_to)