Mongodb操作与Java(二)查询语句汇总

MongoDB概念

MongoDB 基本概念指的是学习 MongoDB 最先应该了解的词汇,比如 MongoDB 中的"数据库"、"集合"、"文档"这三个名词:

文档(Document): 文档是 MongoDB 中最基本的数据单元,由键值对组成,类似于 JSON 格式,可以存储不同字段,字段的值可以包括其他文档,数组和文档数组。(相当于mysql每一行就是一个文档)
集合(Collection): 集合指的是文档组(类似于 Mysql 中的表的概念),里面可以存储许多文档。
数据库(Database): MongoDB 中可以存在多个数据库,每个数据库中中用有不同的集合与用户权限,这样可以供不同的项目组使用不同的数据库。

常用查询语句

查找所有文档

查询集合(比如 users 集合)中的所有文档:这个查询不带任何条件,返回集合中的所有文档。

db.users.find()

分页查询

查询并限制返回10条

db.users.find().limit(10)

查询用户,跳过前 20 个结果,并限制返回的结果数量为 10:.skip(20) 用于跳过前 20 个文档,.limit(10) 用于限制查询结果数量。

db.users.find().skip(20).limit(10)
 

排序查询结果

查询所有用户并按年龄升序排序:

db.users.find().sort({ age: 1 })

查找匹配特定条件的文档

查询所有年龄等于 25 的用户:

db.users.find({ age: 25 })

这里,{ age: 25 } 是一个查询条件,表示筛选出所有 age 字段值为 25 的文档。

模糊查询

假设您有一个名为users的表,其中包含名为name的字段,您想要对这个字段进行模糊搜索。您可以使用正则表达式来匹配包含特定字符串的文档。

db.users.find({ name: { $regex: /your_pattern_here/ } })

如果您想要不区分大小写地进行搜索,可以在正则表达式中末尾添加i标志:

db.users.find({ name: { $regex: /your_pattern_here/i } })

指定字段返回

假设有一个名为 users 的集合,文档结构包含 nameemail age 字段。如果你只想检索 name email 字段,可以使用 .projection 方法来实现

限定返回结果字段

db.users.find({}, { projection: { name: 1, email: 1, _id: 0 } })

这里 { name: 1, email: 1, _id: 0 } 指明返回的文档中应包含 name email 字段,并排除 MongoDB 默认的 _id 字段

包含查询

如果你使用的是 MongoDB Shell 或者类似的接口,并且想要查询 department 等于 "Sales" job_title 包含在某个列表中(如 'Manager' 'Associate')的文档,你可以这样写:
 

db.employees.find({

    department: "Sales",

    job_title: { $in: ["Manager", "Associate"] }

});

这里的 $in 操作符类似于 SQL 中的 IN,用于匹配字段值是否存在于指定数组中。不包含是$nin

大小查询


如果你需要构造一个 MongoDB 查询,以满足字段同时大于等于($gte)和小于等于($lte)一个特定值的条件,同时另一个字段等于($eq)特定的值,你可以使用组合查询。以下是一个具体示例,假设我们需要查询一个集合中,年龄在20岁到30岁之间(包含20岁和30岁),并且名字等于"John"的文档。

db.users.find({

db.users.find({

    age: { $gte: 20, $lte: 30 }, // 年龄大于等于20且小于等于30

    name: { $eq: "John" }        // 名字等于John

});

计数查询结果

计算年龄等于 25 的用户数量:countDocuments 函数统计匹配查询条件的文档数量

db.users.countDocuments({ age: 25 })

或者

查询名字是 "John" 或者 "Jane" 的用户:$or 是逻辑操作符,允许多个查询条件中的任意一个成立时,文档就会被选中。

db.users.find({ $or: [{ name: "John" }, { name: "Jane" }] })

 高级查询

分组

MongoDB 提供了一个强大的聚合框架,类似于 SQL 中的 GROUP BY 功能。这个聚合框架可以用来执行包括数据分组、计算汇总统计等复杂的数据处理任务。在 MongoDB 中,这通常是通过 aggregate 方法来实现的,其中可以使用多种聚合阶段(比如 $group$match$sort 等)来构建复杂的查询和数据处理流程。

使用 $group 进行分组统计

假设你有一个名为 orders 的集合,每个文档包含 customeramount 字段,分别代表客户名和订单金额。如果你想计算每个客户的总订单金额,可以使用以下的聚合查询:

db.orders.aggregate([
    {
        $group: {
            _id: "$customer",
            totalAmount: { $sum: "$amount" }
        }
    }
]);

在这个聚合查询中:

  • $group: 是用来将文档分组的阶段。
    • _id: "$customer":指定分组的键,这里使用 $customer 字段,意味着所有具有相同 customer 字段值的文档会被分到同一组。
    • totalAmount: { $sum: "$amount" }:为每个组计算总金额,$sum 操作符会加总每个组中的 amount 字段值。

结果:只显示_id和totalAmount字段

如果你想先过滤某些文档,再进行分组,可以这样做:

db.orders.aggregate([
    { $match: { status: "shipped" } },
    {
        $group: {
            _id: "$customer",
            totalAmount: { $sum: "$amount" }
        }
    },
    { $sort: { totalAmount: -1 } }
]);

这里:

  • $match: 过滤阶段,只有 status 字段为 "shipped" 的文档才会被处理。
  • $group: 同上,按客户分组并计算总金额。
  • $sort: 排序阶段,按 totalAmount 字段降序排序结果。
注意事项

MongoDB 的聚合操作非常强大,但也需要考虑性能问题,特别是在处理大数据集时。确保你的文档结构和索引策略适合你的聚合查询,以优化查询性能。

连表

在 MongoDB 中,连表查询通常是通过 $lookup 聚合管道操作符来实现的。这个操作符可以让你在一个聚合查询中从另一个集合中查询和合并数据,类似于 SQL 中的 JOIN 操作。

基本使用方法:

假设你有两个集合:ordersproductsorders 集合中的每个文档包含一个 productId 字段,你想将 orders 集合中的每个订单与 products 集合中相应的产品详情进行关联。以下是如何使用 $lookup 来实现这种关联:

db.orders.aggregate([
    {
        $lookup: {
            from: "products",              // 要联接的集合名称
            localField: "productId",       // 本地集合(orders)用于联接的字段
            foreignField: "_id",           // 外部集合(products)用于联接的字段
            as: "productDetails"           // 将联接查询结果添加到该字段
        }
    }
]);
 

解释:

  • from: 指定要联接的另一个集合的名称。
  • localField: 当前集合(发起 $lookup 的集合)中用于联接的字段。
  • foreignField: 被联接集合中用于匹配 localField 的字段。
  • as: 将外部集合的查询结果存储在每个输出文档的哪个字段下。
高级用法

从 MongoDB 3.6 开始,$lookup 支持使用管道,这让你可以在 $lookup 内部执行更复杂的查询,包括过滤、添加字段、限制返回字段等操作。

db.orders.aggregate([
    {
        $lookup: {
            from: "products",
            let: { orderProduct: "$productId" }, // 定义变量 orderProduct
            pipeline: [                          // 使用 pipeline 对 products 进行操作
                { $match: 
                    { $expr:
                        { $eq: ["$_id", "$$orderProduct"] } // 使用变量进行匹配
                    }
                },
                { $project: { name: 1, price: 1 } }        // 限制返回的字段
            ],
            as: "productDetails"
        }
    }
]);

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring高级篇(十)

1、内嵌tomcat boot框架是默认内嵌tomcat的,不需要手动安装和配置外部的 Servlet 容器。 简单的介绍一下tomcat服务器的构成: Catalina: Catalina 是 Tomcat 的核心组件,负责处理 HTTP 请求、响应以及管理 Servlet 生命周期。它包…

excel中数据筛选技巧

1、筛选excel中破折号前后都为空的数据 在Excel中查找破折号前后为空的数据,你可以结合使用Excel的查找和筛选功能,或者利用一些公式来判断。以下是两种常用的方法: 方法一:使用筛选功能选中数据范围:首先&#xff0c…

题目:排序疑惑

问题描述: 解题思路: 做的时候没想到,其实这是以贪心题。我们可以每次排最大的区间(小于n,即n-1大的区间),再判断是否有序 。因此只需要分别判断排(1~n-1)和(…

GateWay检查接口耗时

添加gateway依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId> </dependency>创建一个LogTimeGateWayFilterFactory类&#xff0c;可以不是这个名字但是后面必须是x…

遭遇.halo勒索病毒怎么办?如何识别和应对.halo勒索病毒

导言&#xff1a; 近年来&#xff0c;网络安全问题愈发严峻&#xff0c;其中勒索病毒成为了威胁企业和个人数据安全的重要隐患。在2023年初&#xff0c;一种新的勒索病毒——.halo勒索病毒开始在网络上肆虐&#xff0c;给广大用户带来了极大的困扰。本文91数据恢复将对.halo勒…

NEO 学习之session7

文章目录 选项 A&#xff1a;它涉及学习标记数据。 选项 B&#xff1a;它需要预定义的输出标签进行训练。 选项 C&#xff1a;它涉及在未标记的数据中寻找模式和关系。 选项 D&#xff1a;它专注于根据输入-输出对进行预测。 答案&#xff1a;选项 C 描述了无监督学习的本质&am…

【Pytorch】2.TensorBoard的运用

什么是TensorBoard 是一个可视化和理解深度爵溪模型的工具。它可以通过显示模型结构、训练过程中的指标和图形化展示训练的效果来帮助用户更好地理解和调试他们的模型 TensorBoard的使用 安装tensorboard环境 在终端使用 conda install tensorboard通过anaconda安装 导入类Sum…

判断dll/lib是32/64位、查看lib是导入库/静态库的方法 、查看dll包含的符合、lib包含的函数

一、判断dll/lib是32/64位 原文链接&#xff1a;https://www.cnblogs.com/bandaoyu/p/16752602.html 1. 简便方法&#xff1a; 直接用记事本或者notepad(或txt文本)打开exe文件&#xff08;dll文件&#xff09;&#xff0c;会有很多乱码&#xff0c;不要头疼&#xff0c;接下…

【统计推断】-01 抽样原理之(三)

文章目录 一、说明二、抽样分布三 均值抽样分布3.1 有限母体无放回抽样3.2 有限母体有放回抽样3.3 无限母体 四、比例抽样分布五、和差抽样分布 一、说明 上文中叙述母体和抽样的设计&#xff1b;以及抽样分布的概念&#xff0c;本篇将这种关系定量化&#xff0c;专门针对抽样的…

jmeter后置处理器提取到的参数因为换行符导致json解析错误

现象&#xff1a; {"message":"JSON parse error: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Ill…

ModuleNotFoundError: No module named ‘pkg_resources‘ 问题如何解决?

ModuleNotFoundError: No module named pkg_resources 通常是因为 Python 环境中缺少 setuptools 模块。pkg_resources 是 setuptools 包的一部分&#xff0c;用于处理 Python 包的发行和资源。 为解决这个问题&#xff0c;请按照以下步骤操作&#xff1a; 确保 setuptools 已…

Pytorch基础:内置类type的用法

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 在python中&#xff0c;一切数据类型都是对象&#xff08;即类的实例&#xff09;&#xff0c;包括整数、浮点数、字符串、列表、元组、集合、字典、复数、布尔、函数、…

websevere服务器从零搭建到上线(四)|muduo网络库的基本原理和使用

文章目录 muduo源码编译安装muduo框架讲解muduo库编写服务器代码示例代码解析用户连接的创建和断开回调函数用户读写事件回调 使用vscode编译程序配置c_cpp_properties.json配置tasks.json配置launch.json编译 总结 muduo源码编译安装 muduo依赖Boost库&#xff0c;所以我们应…

npy文件如何追加数据?

.npy 文件是 NumPy 库用于存储数组数据的二进制格式&#xff0c;它包含一个描述数组结构的头部信息和实际的数据部分。直接追加数据到现有的 .npy 文件并不像文本文件那样直接&#xff0c;因为需要手动修改文件头部以反映新增数据后的数组尺寸&#xff0c;并且要确保数据正确地…

【哈希表】Leetcode 14. 最长公共前缀

题目讲解 14. 最长公共前缀 算法讲解 我们使用当前第一个字符串中的与后面的字符串作比较&#xff0c;如果第一个字符串中的字符没有出现在后面的字符串中&#xff0c;我们就直接返回&#xff1b;反之当容器中的所有字符串都遍历完成&#xff0c;说明所有的字符串都在该位置…

从简单逻辑到复杂计算:感知机的进化与其在现代深度学习和人工智能中的应用(上)

文章目录 引言第一章&#xff1a;感知机是什么第二章&#xff1a;简单逻辑电路第三章&#xff1a;感知机的实现3.1 简单的与门实现3.2 导入权重和偏置3.3 使用权重和偏置的实现实现与门实现与非门和或门 文章文上下两节 从简单逻辑到复杂计算&#xff1a;感知机的进化与其在现代…

微信公众号 点击显示答案 操作步骤

1、右键进入检查模式 2、ctrlf查找html元素 3、添加答案区域代码 添加答案区域代码后&#xff0c;可以直接在页面进行格式调整 <!-- 此处height控制显示区域高度 --> <section style"height: 1500px;overflow-x: hidden;overflow-y: auto;text-align: center;b…

博客网站SpringBoot+Vue项目练习

博客网站SpringBootVue简单案例 前言 学了vue后一直没用找到应用的机会&#xff0c;在Github上找到了一个看起来比较友好的项目&#xff08;其实具体代码我还没看过&#xff09;。而且这个项目作者的readme文档写的也算是比较好的了。 项目链接&#xff1a;https://github.c…

基于 Linux 自建怀旧游戏之 - 80 款 H5 精品小游戏合集

1&#xff09;简介 最近又找到了一款宝藏游戏资源分享给大家&#xff0c;包含 80 款 H5 精品小游戏&#xff0c;都是非常有趣味耐玩的游戏&#xff0c;比如 植物大战僵尸、捕鱼达人、贪吃蛇、俄罗斯方块、斗地主、坦克大战、双人五子棋、中国象棋 等等超级好玩的 H5 小游戏&…

ai续写软件哪个好?盘点3款经典好用的!

随着科技的不断发展&#xff0c;AI续写软件逐渐成为了许多内容创作者、学生、研究人员等的得力助手。这类软件能够通过机器学习和自然语言处理技术&#xff0c;为用户提供高质量的文本续写服务。但市场上众多的AI续写软件让人眼花缭乱&#xff0c;那么&#xff0c;究竟哪款AI续…
最新文章