工作需要学习了MongoDB入门教程,学习视频链接: MongoDB数据库教程-尚硅谷
可参考笔记: 了解非关系型数据库 NoSQL - MongoDB | 安装使用以及 CRUD 操作
1.mongodb简介
在MongoDB中数据库database表示一个数据库,集合collection相当于关系型数据库的表,文档document相当于关系型数据库的一行记录。文档document是以二进制json的形式存储在数据库中的,是我们直接操作的对象。
MongoDB中数据库和集合不需要手动创建,当创建文档时,若文档所在集合或数据库不存在会自动创建数据库和集合。
2.基本操作
# 显示当前所有数据库
show dbs
show databases
# 进入指定数据库
use 数据库名
# 显示当前使用的数据库
db
# 显示数据库中所有集合
show collections
3.CRUD
3.1插入文档
- 向集合中插入一个或多个文档
db.<collection>.insert()
没有指定_id属性数据库会自动添加_id属性,作为文档的唯一标识,自己指定时必须确保唯一性 - 插入一个文档对象
db.<collection>.insertOne()
- 插入多个文档对象
db.<collection>.insertMany()
3.2查询文档
- 查询所有(默认按_id排序)
db.<collection>.find()
find()返回的是一个数组 - 带条件查询
db.<collection>.find(查询条件{属性:值})
- 查询符合条件的第一个文档
db.<collection>.findOne()
findOne()返回的是一个文档对象 - 查询符合条件的多个文档
db.<collection>.findMany()
- 统计集合中文档的数量
db.<collection>.find().count()
- 分页查询
db.<collection>.find().skip(跳过执行的条数).limit(每页显示的条数)
- 查询排序(1升序 -1降序)
db.emp.find().sort({sal:1, empno:-1});
- 查询结果投影通过第二个参数设置(1显示 0不显示)
dp.emp.find({},{ename:1, _id:0})
- mongodb会自动调整limit()、skip()、sort()的顺序
# 查询numbers中num大于40并且小于50的文档,$eq表示等于
db.numbers.find({num:{$gt:40, $lt:50}})
# 查询numbers中num大于等于40或者小于等于30的文档
db.numbers.find({${or:[{num:{$gte:40}}, {num:{$lte:50}}]})
# 跳过10条展示10条,即展示11-20条数据
db.numbers.find().skip(10).limit(10)
3.3修改文档
- 语法:
db.<collection>.update(查询条件,新对象)
update()默认情况下使用新对象替换旧对象,只修改一个 - 如果需要修改指定属性,而不是替换则需使用“修改操作符”完成修改
$set
修改文档中的指定属性
$unset
删除文档的指定属性
$push
向数组中添加一个新的元素,不考虑去重
$addToSet
向数组中添加一个新的元素,去重 - 修改一个符合条件的文档
db.<collection>.updateOne()
- 同时修改符合条件的多个文档
db.<collection>.updateMany()
3.4删除文档
- 删除符合条件的所有文档,默认删除多个
db.<collection>.remove()
若remove()第二个参数传递一个true,则只会删除一个
remove()可以根据条件删除,传递条件方式同find() - 删除一个
db.<collection>.deleteOne()
- 删除多个
db.<collection>.deleteMany()
- 删除集合而非清空集合
db.<collection>.drop()
说明:
- mongodb的文档的属性值也可以是一个文档,属性值为文档时称为内嵌文档
- mongodb支持直接通过内嵌文档的属性进行查询,要查询的内嵌文档可以通过.的形式匹配,此时属性名必须使用引号
4.文档之间的关系
- 一对一(one to one):通过内嵌文档的形式体现
- 一对多(one to many)/多对一(many to one):也可以通过内嵌文档的形式体现
- 多对多(many to many)
5.Pyhton连接Mongo应用实例
from pymongo import MongoClient, UpdateOne
from os import path
import pymongo
root_path = path.dirname(__file__)
mongo_cfg = dict()
mongo_cfg['your_mongo_cfg'] = {
"user": "your_username",
"ip": "your_ip",
"password": "your_password",
"db_name": "your_db_name",
}
class MongoData:
def __init__(self, parameters):
self.db = MongoClient()
self.mongo_link(parameters)
def mongo_link(self, parameters):
user = parameters["user"]
ip = parameters["ip"]
password = parameters["password"]
db_name = parameters["db_name"]
mongo_conn = 'mongodb://{user}:{password}@{ip}/?authSource={auth}&readPreference=secondary' \
.format(user=user, password=password, ip=ip, auth='admin')
client = MongoClient(mongo_conn)
self.db = client[db_name]
def run(self, parameters):
db_sub_name = parameters["db_sub_name"]
search_dict = parameters["search_dict"]
posts = eval("self.db." + str(db_sub_name))
raw = posts.find(search_dict)
return raw
def run_insert_one(self, parameters: dict, json_data: dict):
db_sub_name = parameters["db_sub_name"]
posts = eval("self.db." + str(db_sub_name))
posts.insert(json_data)
def run_upload_one(self, parameters: dict, key_value: dict, json_data: dict):
db_sub_name = parameters["db_sub_name"]
posts = eval("self.db." + str(db_sub_name))
posts.replace_one(filter=key_value, replacement=json_data, upsert=True)
def run_delete_many(self, parameters: dict, query=None):
"""
:param parameters:
:param query: eg.{"_id": {"$in": []}}
:return:
"""
db_sub_name = parameters["db_sub_name"]
posts = eval("self.db." + str(db_sub_name))
if query is None:
posts.delete_many({})
else:
posts.delete_many(query)
def run_upload_many(self, parameters: dict, input_data: dict, key_name="_id"):
db_sub_name = parameters["db_sub_name"]
posts = eval("self.db." + str(db_sub_name))
update_operations = []
for key in input_data:
op = UpdateOne({key_name: key}, {'$set': input_data[key]}, upsert=True)
update_operations.append(op)
posts.bulk_write(update_operations, ordered=False)
def run_create_index(self, parameters: dict, key: str):
db_sub_name = parameters["db_sub_name"]
posts = eval("self.db." + str(db_sub_name))
posts.create_index([(key, pymongo.ASCENDING)])
if __name__ == "__main__":
mongo_db = MongoData(mongo_cfg['your_mongo_cfg'])
search_dict = {
"_id": {"$in": []}, # 根据id查询
}
raw = list(mongo_db.run(
parameters={
"search_dict": search_dict
}
))
print(raw)