【Mongo Database学习笔记】


工作需要学习了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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值