mongdb学习与使用

news2024/12/23 8:21:29

1. 基础概念

  • MongoDB简介:

    • MongoDB是一个基于文档的NoSQL数据库,具有高性能、高可用性和易扩展性。
    • 数据存储在类似JSON的BSON格式中。
  • 基本术语:

    • Database(数据库): 集合的容器。
    • Collection(集合): 文档的容器,类似于关系型数据库中的表。
    • Document(文档): 数据的基本单元,类似于关系型数据库中的行。

2. 安装与设置

  • 安装MongoDB:

    • 官方安装指南
  • 启动MongoDB服务:

    • Windows: mongod
    • Mac/Linux: sudo service mongod start
  • MongoDB Shell:

    • 连接MongoDB实例:mongo

3. 基本操作

  • 选择数据库:use share  选中share的数据库

  • 创建集合  db.createCollection("news") 创建一个名字为news的集合

    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

  • 插入数据(文档)   db.news.insertOne({ name: "Alice", age: 25, city: "New York" }) 像news这个集合中插入一条数据

  • 查询文档:

  • 查所有

  • db.news.find() 查找所有的文档

  • 带条件

  • db.news.find({ age: 25 })  带条件查找 查询年龄为25的这一条数据

  • db.news.find({ age: { $gt: 20 }) 查询年龄大于20岁的

  • db.news.find({age:{$gt:20}},{name:1,age:1,_id:0})  查询年龄>20,且返回name,age字段,不返回_id字段

  • 排序

  • db.news.find().sort({age:-1})  按照年龄降序排序

  • db.news.find().sort({age:1})  按照年龄升序​​​​​​

  • 分页

  • 跳过指定数量的文档

    db.news.find().skip(10)

  • 限制返回的文档数量

    db.news.find().limit(5)

  • 分页查询

    db.news.find().skip(10).limit(5)

  • 逻辑操作符

    • $and:与

      db.news.find({ $and: [ { age: { $gt: 20 } }, { age: { $lt: 30 } } ] }) 查询大于二十小于三十

    • $or:或

    • db.news.find({ $or: [ { age: 25 }, { age: 30 } ] })

    • 查询年龄是25跟30的那两条

    • $not:非

      db.myCollection.find({ age: { $not: { $gt: 20 } } })

  • 数组操作符

    • $in:在指定数组中

      db.news.find({ age: { $in: [25, 30, 35] } })

    • $nin:不在指定数组中

      db.news.find({ age: { $nin: [20, 25, 30] } })

    • $all:包含数组中的所有元素

      db.news.find({ tags: { $all: ["red", "blue"] } })

  • 更新文档 

  • db.news.updateOne({ name: "Alice" }, { $set: { age: 26 } }) 更新语句用于在 news集合中查找 name 字段值为 "Alice" 的文档,并将其 age 字段更新为 26。如果文档中没有 age 字段,则会添加这个字段。

  • 删除文档

  • db.news.deleteOne({ name: "Alice" }) 删除所有 name 字段为Alice的文档

4.Python整合mongdb

1.安装pymongdb

pip install pymongdb

2.连接

from mongdb import MongClient

client =MongClient("localhost", 27017)

db = client['mydatabase']  选择名为mydatabase的数据库,没有则自动创建

# 选择集合(如果集合不存在,MongoDB会自动创建)  
collection = db['mycollection']

3.就是做一些业务操作了,增删改,这举出一个分页查询的代码

@bp.route('/list', methods=['GET'])
def list_documents():
    try:
        # 获取分页参数
        page = int(request.args.get('page', 1))
        per_page = int(request.args.get('per_page', 40))

        # 计算跳过的记录数量
        skip = (page - 1) * per_page

        # 获取集合
        with get_mongo_db() as m_db:
            collection = m_db.information
            # 查询文档并排序
            pipeline = [
                {"$sort": {"publish_date": -1}},
                {"$skip": skip},
                {"$limit": per_page},
                {"$project": {
                    "full_title": 1,
                    "report_type": 1,
                    "publish_date": 1,
                    "researcher": 1,
                    "detail_link": 1,
                    "_id": {"$toString": "$_id"}
                }}
            ]
            documents = collection.aggregate(pipeline)
            # 将查询结果转换为列表
            documents_list = list(documents)

            # 获取总记录数
            total_documents = collection.count_documents({})

            # 计算总页数
            total_pages = (total_documents + per_page - 1) // per_page

        result = {
            "documents": documents_list,
            "page": page,
            "per_page": per_page,
            "total_pages": total_pages,
            "total_documents": total_documents
        }

        return Success(message="查询列表成功", result=result)
    except Exception as e:
        logger.error(e)
        return Fail('查询失败')

然后这里普及一下我踩的坑吧,

1.在插入数据的时候,会自动生成一个_id的对象,这是mongdb自动生成,且是唯一的,如果你

from bson  improt Objectid

Objectid(id)

利用这个把前端传的字符串id对象转为Objectid,这样才好去查询

如果是返回的话,直接下面这样操作

document['_id'] = str(document['_id'])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1891428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ShareSDK iOS端如何实现小红书分享

下载SDK 请登陆官网 ,找到SDK下载,勾选需要的平台下载 导入SDK (1)离线导入将上述下载到的SDK,直接将整个SDK资源文件拖进项目里,如下图: 并且勾选以下3个选项 在点击Finish,…

多载波调制与OFDM原理讲解以及MATLAB实现GUI设计

前言 基于MATLAB设计并实现了一个OFDM调制的图形用户界面(GUI)系统。该系统旨在简化OFDM调制过程的仿真,提供友好的用户交互界面。设计目标是通过GUI实现参数化的OFDM仿真,包括子载波数、符号数、IFFT长度、循环前缀长度、循环后…

Android 换肤之插件换肤

文章目录 Android 换肤之插件换肤概述效果使用步骤代码结构原理 代码下载 Android 换肤之插件换肤 概述 Android 实现应用内换肤的常用方式(两种): 通过Theme切换主题,即静态方法。通过AssetManager切换主题,可实现…

单元测试总结,一文全通

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、何为单测 测试有黑盒测试和白盒测试之分,黑盒测试顾名思义就是我们不了解盒子的…

数据泄露时代的安全之道:访问认证的重要性

引言 想象一下:你一觉醒来,收到一条通知——你的公司遭遇了数据泄露。你感到恐惧,因为这意味着客户数据被曝光,公司声誉受损,还有巨额罚款在等着你。在当今的数字化环境中,这种情况太常见了。全球各地的组…

ansible执行任务时,报错/usr/bin/env node没有文件或目录。

报错如图: 解决:添加软链即可 sudo ln -s /home/app/node-v18.20.3/bin/node /usr/bin/node

Qt开发 | qss简介与应用

文章目录 一、qss简介与应用二、QLineEdit qss介绍与使用三、QPushButton qss1.常用qss1.1 基本样式表1.2 背景图片1.3 图片在左文字在右 2.点击按钮弹出菜单以及右侧箭头样式设置3.鼠标悬浮按钮弹出对话框 四、QCheckBox qss妙用:实时打开关闭状态按钮五、QComboBo…

0-FreeCAD简介

这里写自定义目录标题 FreeCAD简介FreeCAD简介 FreeCAD是一款开源的三维计算机辅助设计(CAD)软件,它主要用于产品设计和工程制图。这款软件可以创建和修改3D模型,支持参数化设计,意味着你可以通过改变模型的参数来调整模型的大小、形状等属性。FreeCAD还支持多种3D文件格式…

【C语言】enum 关键字

在C语言中,enum关键字用于定义枚举类型。枚举是一种用户自定义的数据类型,由一组命名的整型常量构成。使用枚举可以提高代码的可读性和可维护性,特别是在表示一组相关的常量时。 定义和使用枚举类型 基本定义 要定义一个枚举类型&#xff…

党建科普3D数字化展馆支持实时更新迭代

3D虚拟策展逐渐成为新时代下的主流方式,深圳华锐视点作为专业的web3d开发公司,具有专业化的3D数字化空间还原能力,能根据企业/个人不同需求和预算,为您打造纯线上虚拟3D艺术展,让您彻底摆脱实体美术馆的限制&#xff0…

使用Ckman部署ClickHouse集群介绍

使用Ckman部署ClickHouse集群介绍 1. Ckman简介 ClickHouse Manager是一个为ClickHouse数据库量身定制的管理工具,它是由擎创科技数据库团队主导研发的一款用来管理和监控ClickHouse集群的可视化运维工具。目前该工具已在github上开源,开源地址为&…

【基于R语言群体遗传学】-4-统计建模与算法(statistical tests and algorithm)

之前的三篇博客,我们对于哈代温伯格遗传比例有了一个全面的认识,没有看的朋友可以先看一下前面的博客: 群体遗传学_tRNA做科研的博客-CSDN博客 1.一些新名词 (1)Algorithm: A series of operations executed in a s…

uni-app上传失败超出文件限制解决方法-分包处理-预加载

分包背景 当你的上传出现一下错误: Error: 系统错误,错误码:80051,source size 2089KB exceed max limit 2MB [20240703 10:53:06][wxbf93dfb6cb3eb8af] [1.06.2405010][win32-x64] 说明你主包太大需要处理了,一下两种方法可以…

51单片机嵌入式开发:STC89C52操作8八段式数码管原理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 STC89C52操作8八段式数码管原理 1 8位数码管介绍1.1 8位数码管概述1.2 8位数码管原理1.3 应用场景 2 原理图图解2.1 74HC573原理2.2 74HC138原理2.3 数码管原理 3 数码管程序…

QT_GUI

1、QT安装 一个跨平台的应用程序和用户界面框架,用于开发图形用户界面(GUI)应用程序以及命令行工具。QT有商业版额免费开源版,一般使用免费开源版即可,下面安装的是QT5,因为出来较早,使用较多&…

【前端CSS3】CSS引入方式总结(黑马程序员)

文章目录 一、前言🚀🚀🚀二、CSS引入方式:☀️☀️☀️2.1 内部样式表2.2 行内样式表 三、总结🚀🚀🚀 一、前言🚀🚀🚀 ☀️ 回报不在行动之后,回报…

ETL数据集成丨使用ETLCloud实现MySQL与Greenplum数据同步

我们在进行数据集成时,MySQL和Greenplum是比较常见的两个数据库,我们可以通过ETLCloud数据集成平台,可以快速实现MySQL数据库与数仓数据库(Greenplum)的数据同步。 MySQL数据库: 优点: 轻量级…

Java实现电子围栏的小例子

主要需求是实现一个电子围栏判断的小例子其中包括前端和后端的demo代码 public class GeoFenceUtils {/** geometryFactory */private static final GeometryFactory geometryFactory new GeometryFactory();/*** 判断指定的GPS点是否在电子围栏内** param fencePointsList 包…

上海小程序开发需要进行定制开发吗?

随着互联网技术与移动设备的不断成熟,小程序也已普及到人们日常生活的方方面面。随着企业与互联网联结的愈发深入,小程序的开发可以为企业带来更高效的经营模式,降本增效。那么,上海小程序作为无需安装且开发门槛较低的应用&#…

udp发送数据如果超过1个mtu时,抓包所遇到的问题记录说明

最近在测试Syslog udp发送相关功能,测试环境是centos udp头部的数据长度是2个字节,最大传输长度理论上是65535,除去头部这些字节,可以大概的说是64k。 写了一个超过64k的数据(随便用了一个7w字节的buffer)发送demo,打…