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.mzph.cn/web/8987.shtml

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

相关文章

设计模式在JavaScript中的应用:介绍一些常见的设计模式如观察者模式,工厂模式,策略模式等,并展示如何在JavaScript中实现

1、观察者模式:观察者模式是一种在项目中创建可观察者的方法,以便在对象之间实现好的通信机制。 在JavaScript中我们可以使用EventEmitter类来实现观察者模式。 class EventEmitter {constructor() {this.events {};}on(type, listener) {this.events…

掌握学习平台中的高效学习技巧

学习在我们生活中起着至关重要的作用。随着科技的发展,越来越多的学习平台为我们提供了更广阔的学习机会。然而,要实现高效学习,我们需要掌握一些技巧。 规划学习目标 首先,一个明确的学习目标是高效学习的基础。在使用学习平台…

如何将jsp项目转成springboot项目

昨天说过,springboot推荐使用Thymeleaf作为前后端渲染的模板引擎,为什么推荐用Thymeleaf呢,有以下几个原因: 动静结合:Thymeleaf支持HTML原型,允许在HTML标签中增加额外的属性来实现模板与数据的结合。这样…

ts中type和interface的区别

面试中被问到,在TypeScript中,Type和Interface的区别这个问题。 区别 首先,在TypeScript中,Type和Interface都用于定义对象或函数的类型,区别如下: 语法不同 interface使用关键字interface来定义&#…

Redis缓存雪崩,击穿,穿透问题

缓存雪崩、击穿、穿透、发生的背景 ​ 作者最近在写一个社区论坛项目,初始设想将论坛里用户发布的帖子内容存到数据库中,当用户访问论坛里的帖子时,帖子信息都从数据库中查。众所周知数据库的帖子数据是存在磁盘中的,而磁盘读写数…

20240509解决Protel99se导入philips.ddb出现File is not recognized的问题

20240509解决Protel99se导入philips.ddb出现File is not recognized的问题 2024/5/9 16:25 缘起:最近需要用到/画PCB,想到十年前用过Protel99SE。 使用的系统:WIN10/WIN11都会出错。WIN7没有测试! 从115网盘的角落里找到七集视频…

【笔记】Anaconda命令提示符(Anaconda Prompt)操作

通过anaconda配置python环境有时需要conda安装一些包或者文件,这里作为一个笔记记录如何打开Anaconda命令提示符(Anaconda Prompt),并用conda操作 1.打开Anaconda命令提示符(Anaconda Prompt) 可直接在搜…

DELL EMC unity存储系统如何初始化

在客户的存储使用过程中,经常会碰到一些场景需要对存储系统做重新初始化,就是回到出厂时候的配置。比如,客户设备要利旧,二次使用,一般都要回到出厂状态做重新配置的动作。存储严重故障,没有能力修复或者数…

十四五”智慧城市:视频大数据汇聚系统2.0建设方案与特点分析

一、背景需求分析 随着科技的不断发展,智慧城市的建设已经成为城市发展的重要方向。视频汇聚系统作为智慧城市建设的重要组成部分,已经得到了广泛的应用和推广。视频汇聚系统是智慧城市中非常重要的组成部分,它利用摄像头和传感器技术来收集…

IDEA切换分支

1、选择要切换分支的module 2、右键,选择git 3、再点击branches 4、可以看到当前module的本地分支(local Branches)及远程分支(Remote Branches)列表。点击你要切换到的分支,Checkout即可。

MySQL变量的定义与使用

# MySQL变量的定义与使用 # 标识符命名规范 # 1、不允许使用数字作为开头 # 2、只能使用_和$符号,不允许使用其他符号 # 3、不允许使用关键字和保留字 set userName小可爱; select userName; # 定义数值类型:整数,小数 set x100,y2; select x…

卡牌——蓝桥杯十三届2022国赛大学B组真题

样例输入 4 5 1 2 3 4 5 5 5 5样例输出 3样例说明 这 5 张空白牌中,拿2张写1,拿1张写2,这样每种牌的牌数就变为了3,3,3,4, 可以凑出 3套牌,剩下2张空白牌不能再帮助小明凑出一套。 评测用例规模与约定 对于30%的数据,保证n ⩽ \leqslant ⩽ 2000; 对于100%的数据…

Baidu Comate:智能编码,编程效率的革新者

文章目录 一、何为智能编码助手?二、Baidu Comate智能编码助手简介三、Baidu Comate注册四、Baidu Comate体验Comate插件功能1.注释生成代码2.函数注释生成3.行间注释生成4.生成代码解释5. 调优建议 五、插件功能的使用体验感受和建议 🚩结语 一、何为智…

JS中的扩展运算符...

JS中的…是扩展运算符,是es6的新语法; 其作用在对象上,返回一个对象,取出对象所有可遍历属性; 场景1: let person { name:张三,age:18}let someone {...person}console.log(someone) //返回 {…

走进标杆企业 | 山东国屹建材实现双站一体化管理

走进标杆企业 走进标杆企业,感受名企力量,探寻学习优秀企业领先之道。本期要跟砼行们推介的标杆企业是山东国屹新型建材有限公司。 山东国屹新型建材有限公司成立于2018年,共建有两个站点、四条混凝土生产线,预拌混凝土实际日产…

手写SpringBoot核心功能流程

本文通过手写模拟实现一个简易版的Spring Boot 程序,让大家能以非常简单的方式知道Spring Boot大概的工作流程。 工程依赖 创建maven工程,并创建两个module springboot模块:手写模拟springboot框架的源码实现 test模块:业务系统…

【GDAL应用】基于rasterstats的矢量数据分区统计栅格值信息

文章目录 1 实现效果2 实现功能3 实现代码 1 实现效果 矢量数据: 栅格数据:只有一个value值(像素值或DN值),为1,计算统计时nodata作为0值处理。 输出结果: 2 实现功能 基于单波段的栅格数…

代码随想录刷题打卡day22

1 最大二叉树 使用递归的思路构造二叉树,一般选择前序遍历对树进行构造,需要先构造中间节点,然后递归构造左子树和右子树。 三部曲 确定递归函数的参数和返回值 参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点&…

英语单词学习

house of worship:宗教场所 dote: 喜爱 coffin:棺材 coffeine:咖啡因 expedient:权宜的 buster:破坏者 procrastinate: 拖延 gourmet:美食家 expound:阐述 narcissist:自我陶醉 assassinate:暗杀 salvage: 挽救 savage: 凶猛的 ulcer: 溃疡 obituary:讣告 arbitrary:武断的 abu…

关于勒索攻击,绝大多数企业存在的三个认知误区

网络空间,有一个挥之不去的“幽灵”,它的名字就叫勒索攻击。 近年来,企业遭受勒索攻击的事件被频频曝光。就在不久前,国家安全部曝光了一起境外黑客组织对我国某高新科技企业实施勒索攻击的案例,该企业的相关信息化系统…