MongoDB增删改查,复杂查询案例分析

news2024/11/14 11:10:22

以下是使用 Java 对 MongoDB 进行增删改查操作以及复杂查询案例分析:

一、添加依赖

在 Maven 项目中添加 MongoDB Java 驱动依赖:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.10.1</version>
</dependency>

二、连接 MongoDB 数据库

import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;

public class MongoApp {
    public static void main(String[] args) {
        // 创建 MongoDB 客户端连接
        MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
        // 获取数据库
        MongoDatabase database = mongoClient.getDatabase("yourDatabaseName");
    }
}

三、插入数据(Insert)

  1. 插入单个文档:
    import org.bson.Document;
    
    public class MongoApp {
        public static void main(String[] args) {
            // 创建 MongoDB 客户端连接和获取数据库(如上述代码)
            // 插入单个文档
            Document userDoc = new Document("name", "Tom")
                   .append("age", 28)
                   .append("email", "tom@example.com");
            database.getCollection("users").insertOne(userDoc);
        }
    }
  2. 插入多个文档:
    import org.bson.Document;
    import java.util.ArrayList;
    import java.util.List;
    
    public class MongoApp {
        public static void main(String[] args) {
            // 创建 MongoDB 客户端连接和获取数据库(如上述代码)
            // 插入多个文档
            Document user1 = new Document("name", "Jerry")
                   .append("age", 25)
                   .append("email", "jerry@example.com");
            Document user2 = new Document("name", "Lucy")
                   .append("age", 32)
                   .append("email", "lucy@example.com");
            List<Document> userList = new ArrayList<>();
            userList.add(user1);
            userList.add(user2);
            database.getCollection("users").insertMany(userList);
        }
    }

四、删除数据(Delete)

  1. 删除单个文档:
    import org.bson.Document;
    
    public class MongoApp {
        public static void main(String[] args) {
            // 创建 MongoDB 客户端连接和获取数据库(如上述代码)
            // 删除单个文档
            database.getCollection("users").deleteOne(new Document("name", "Tom"));
        }
    }
  1. 删除多个文档:
    import org.bson.Document;
    
    public class MongoApp {
        public static void main(String[] args) {
            // 创建 MongoDB 客户端连接和获取数据库(如上述代码)
            // 删除多个文档
            database.getCollection("users").deleteMany(new Document("age", { $gt: 30 }));
        }
    }

五、更新数据(Update)

  1. 更新单个文档的部分字段:
    import org.bson.Document;
    
    public class MongoApp {
        public static void main(String[] args) {
            // 创建 MongoDB 客户端连接和获取数据库(如上述代码)
            // 更新单个文档的部分字段
            database.getCollection("users").updateOne(new Document("name", "Jerry"),
                    new Document("$set", new Document("age", 26)));
        }
    }
  2. 更新多个文档的部分字段:
    import org.bson.Document;
    
    public class MongoApp {
        public static void main(String[] args) {
            // 创建 MongoDB 客户端连接和获取数据库(如上述代码)
            // 更新多个文档的部分字段
            database.getCollection("users").updateMany(new Document(),
                    new Document("$set", new Document("email", new Document("$replaceAll", new Document("input", "$email").append("find", "@example.com").append("replace", "@newdomain.com")))));
        }
    }

六、查询数据(Find)

  1. 基本查询:
    import org.bson.Document;
    import com.mongodb.client.FindIterable;
    import com.mongodb.client.MongoCursor;
    
    public class MongoApp {
        public static void main(String[] args) {
            // 创建 MongoDB 客户端连接和获取数据库(如上述代码)
            // 基本查询
            FindIterable<Document> allUsers = database.getCollection("users").find();
            MongoCursor<Document> cursor = allUsers.iterator();
            while (cursor.hasNext()) {
                System.out.println(cursor.next());
            }
        }
    }
  2. 投影查询(只返回指定字段):
    import org.bson.Document;
    import com.mongodb.client.FindIterable;
    import com.mongodb.client.MongoCursor;
    
    public class MongoApp {
        public static void main(String[] args) {
            // 创建 MongoDB 客户端连接和获取数据库(如上述代码)
            // 投影查询
            FindIterable<Document> userNamesAndAges = database.getCollection("users").find(new Document(), new Document("name", 1).append("age", 1));
            MongoCursor<Document> cursor = userNamesAndAges.iterator();
            while (cursor.hasNext()) {
                System.out.println(cursor.next());
            }
        }
    }

七、复杂查询案例分析

  1. 多条件查询:假设我们有一个商品集合products,文档包含namecategorypricestock等字段。我们要查询特定类别(如 “电子产品”)且价格在某个区间(如 100 到 500)并且有库存的商品。
    import org.bson.Document;
    import com.mongodb.client.FindIterable;
    import com.mongodb.client.MongoCursor;
    
    public class MongoApp {
        public static void main(String[] args) {
            // 创建 MongoDB 客户端连接和获取数据库(如上述代码)
            // 多条件查询
            FindIterable<Document> productsQuery = database.getCollection("products").find(new Document("category", "电子产品").append("price", new Document("$gte", 100).append("$lte", 500).append("stock", new Document("$gt", 0)));
            MongoCursor<Document> cursor = productsQuery.iterator();
            while (cursor.hasNext()) {
                System.out.println(cursor.next());
            }
        }
    }
  2. 排序和分页查询:假设我们要查询商品集合,按照价格降序排列,每页显示 10 个商品,获取第二页的内容。
    import org.bson.Document;
    import com.mongodb.client.FindIterable;
    import com.mongodb.client.MongoCursor;
    import com.mongodb.client.model.Sorts;
    import com.mongodb.client.model.SkipLimit;
    
    public class MongoApp {
        public static void main(String[] args) {
            // 创建 MongoDB 客户端连接和获取数据库(如上述代码)
            // 排序和分页查询
            FindIterable<Document> sortedAndPaginatedProducts = database.getCollection("products").find().sort(Sorts.descending("price")).skip(10).limit(10);
            MongoCursor<Document> cursor = sortedAndPaginatedProducts.iterator();
            while (cursor.hasNext()) {
                System.out.println(cursor.next());
            }
        }
    }
  3. 聚合查询(复杂数据分析):假设我们想统计每个类别下的商品数量以及平均价格。
    import org.bson.Document;
    import com.mongodb.client.MongoCollection;
    import com.mongodb.client.MongoDatabase;
    import com.mongodb.client.AggregateIterable;
    import com.mongodb.client.MongoCursor;
    
    public class MongoApp {
        public static void main(String[] args) {
            // 创建 MongoDB 客户端连接和获取数据库(如上述代码)
            // 聚合查询
            MongoCollection<Document> collection = database.getCollection("products");
            AggregateIterable<Document> categoryStats = collection.aggregate(
                    java.util.Arrays.asList(
                            new Document("$group", new Document("_id", "$category").append("count", new Document("$sum", 1)).append("averagePrice", new Document("$avg", "$price")))
            );
            MongoCursor<Document> cursor = categoryStats.iterator();
            while (cursor.hasNext()) {
                System.out.println(cursor.next());
            }
        }
    }

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

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

相关文章

Python+Pytest+Allure+Git+Jenkins接口自动化框架

一、接口基础 接口测试是对系统和组件之间的接口进行测试&#xff0c;主要是效验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。其中接口协议分为HTTP&#xff0c;RPC&#xff0c;Webservice&#xff0c;Dubbo&#xff0c;RESTful等类型。 接口…

Docker:镜像构建 DockerFile

Docker&#xff1a;镜像构建 DockerFile 镜像构建docker build DockerfileFROMCOPYENVWORKDIRADDRUNCMDENTRYPOINTUSERARGVOLUME 镜像构建 在Docker官方提供的镜像中&#xff0c;大部分都是基础镜像&#xff0c;他们只提供某个简单的功能&#xff0c;如果想要一个功能更加丰富…

《JavaEE进阶》----20.<基于Spring图书管理系统①(登录+添加图书)>

PS&#xff1a;关于接口定义 接口定义&#xff0c;通常由服务器提供方来定义。 1.路径&#xff1a;自己定义 2.参数&#xff1a;根据需求考虑&#xff0c;我们这个接口功能完成需要哪些信息。 3.返回结果&#xff1a;考虑我们能为对方提供什么。站在对方角度考虑。 我们使用到的…

【JavaEE】文件io

目录 文件类型 File概述 属性 构造方法 常用方法 Reader Writer InputStream OutputStream 字节流转字符流 通过Scanner读取InputStream 通过PrintWriter转换outputstream 示例 文件类型 从编程的角度看&#xff0c;文件类型主要就是两大类 文本&#xff08;文…

D3入门:概念、主要特点、基本功能、常见应用场景

D3.js&#xff08;Data-Driven Documents&#xff09;是一个JavaScript库&#xff0c;用于基于数据操作文档。它利用了HTML、SVG和CSS等Web标准技术&#xff0c;使得开发者可以创建丰富的交互式图表和数据可视化。D3.js的强大之处在于其灵活的数据绑定机制和对DOM元素的高效操作…

go函数传值是值传递?还是引用传递?slice案例加图解

先说下结论 Go语言中所有的传参都是值传递&#xff08;传值&#xff09;&#xff0c;都是一个副本&#xff0c;一个拷贝。 值语义类型&#xff1a;参数传递的时候&#xff0c;就是值拷贝&#xff0c;这样就在函数中就无法修改原内容数据。 基本类型&#xff1a;byte、int、bool…

tensorflow案例5--基于改进VGG16模型的马铃薯识别,准确率提升0.6%,计算量降低78.07%

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 本次采用VGG16模型进行预测&#xff0c;准确率达到了98.875&#xff0c;但是修改VGG16网络结构&#xff0c; 准确率达到了0.9969&#xff0c;并且计算量…

攻防世界38-FlatScience-CTFWeb

攻防世界38-FlatScience-Web 点开这个here看到一堆pdf,感觉没用&#xff0c;扫描一下 试试弱口令先 源码里有&#xff1a; 好吧0.0 试试存不存在sql注入 根本没回显&#xff0c;转战login.php先 输入1’,发现sql注入 看到提示 访问后得源码 <?php ob_start(); ?>…

数据分析-44-时间序列预测之深度学习方法TCN

文章目录 1 TCN简介1.1 网络示意图1.2 TCN优点2 模拟应用2.1 模拟数据2.2 预处理创建滞后特征2.3 划分训练集和测试集2.4 创建TCN模型2.5 模型训练2.6 模型预测3 自定义my_TCN模型3.1 my_TCN()函数3.2 训练模型3.3 模型预测3.4 改进4 参考附录1 TCN简介 时间卷积网络(TCN)是…

C++【STL容器系列(二)】vector的模拟实现

文章目录 1. vector的结构2. vector的默认成员函数2.1构造函数2.1.1 默认构造2.1.2 迭代器构造2.1.3 用n个val初始化构造 2.2 拷贝构造2.3 析构函数2.4 operator 3. vector iterator函数3.1 begin 和 cbegin函数3.2 end() 和 cend()函数 4. vector的小函数4.1 size函数4.2 capa…

【linux】网络基础 ---- 应用层

1. 再谈 "协议" 协议是一种 "约定"&#xff0c;在读写数据时, 都是按 "字符串" 的方式来发送接收的. 但是这里我们会遇到一些问题&#xff1a; 如何确保从网上读取的数据是否是完整的&#xff0c;区分缓冲区中的由不同客户端发来的数据 2. 网…

C语言PythonBash:空白(空格、水平制表符、换行符)与转义字符

C语言 空白 C语言中的空白&#xff08;空格、水平制表符、换行符&#xff09;被用于分隔Token&#xff0c;因此Token间可以有任意多个空白。 // 例1 printf("Hello, World!"); 例1中存在5个Token&#xff0c;分别是&#xff1a; printf("Hello, World! \n&qu…

Linux基础(十四)——BASH

BASH 1.BASH定义2.shell的种类3.bash的功能3.1 命令记录功能3.2 命令补全功能3.3 命令别名设置3.4 工作控制、 前景背景控制3.5 程序化脚本&#xff1a; &#xff08; shell scripts&#xff09;3.6 万用字符 4.bash的内置命令5.shell的变量功能5.1 变量的取用5.2 新建变量5.3 …

【重学 MySQL】八十二、深入探索 CASE 语句的应用

【重学 MySQL】八十二、深入探索 CASE 语句的应用 CASE语句的两种形式CASE语句的应用场景数据分类动态排序条件计算在 SELECT 子句中使用在 WHERE子句中使用在 ORDER BY 子句中使用 注意事项 在MySQL中&#xff0c;CASE 语句提供了一种强大的方式来实现条件分支逻辑&#xff0c…

由播客转向个人定制的音频频道(1)平台搭建

项目的背景 最近开始听喜马拉雅播客的内容&#xff0c;但是发现许多不方便的地方。 休息的时候收听喜马拉雅&#xff0c;但是还需要不断地选择喜马拉雅的内容&#xff0c;比较麻烦&#xff0c;而且黑灯操作反而伤眼睛。 喜马拉雅为代表的播客平台都是VOD 形式的&#xff0…

7+纯生信,单细胞识别细胞marker+100种机器学习组合建模,机器学习组合建模取代单独lasso回归势在必行!

影响因子&#xff1a;7.3 研究概述&#xff1a; 皮肤黑色素瘤&#xff08;SKCM&#xff09;是所有皮肤恶性肿瘤中最具侵袭性的类型。本研究从GEO数据库下载单细胞RNA测序&#xff08;scRNA-seq&#xff09;数据集&#xff0c;根据原始研究中定义的细胞标记重新注释各种免疫细胞…

uniapp解析蓝牙设备响应数据bug

本文章为了解决《uniapp 与蓝牙设备收发指令详细步骤(完整项目版)》中第十步的Array 解析成 number函数bug 1、原代码说明 function array16_to_number(arrayValue) {const newArray arrayValue.filter(item > String(item) ! 00 || String(item) ! 0)const _number16 ne…

【递归回溯与搜索算法篇】算法的镜花水月:在无尽的自我倒影中,递归步步生花

文章目录 递归回溯搜索专题&#xff08;一&#xff09;&#xff1a;递归前言第一章&#xff1a;递归基础及应用1.1 汉诺塔问题&#xff08;easy&#xff09;解法&#xff08;递归&#xff09;C 代码实现时间复杂度和空间复杂度易错点提示 1.2 合并两个有序链表&#xff08;easy…

大数据开发面试宝典

312个问题&#xff0c;问题涵盖广、从自我介绍到大厂实战、19大主题&#xff0c;一网打尽、真正提高面试成功率 一、Linux 1. 说⼀下linux的常⽤命令&#xff1f; 说一些高级命令即可 systemctl 设置系统参数 如&#xff1a;systemctl stop firewalld关闭防火墙 tail / hea…

链表归并与并集相关算法题|两递增归并为递减到原位|b表归并到a表|两递减归并到新链表(C)

两递增归并为递减到原位 假设有两个按元素递增次序排列的线性表&#xff0c;均以单链表形式存储。将这两个单链表归并为一个按元素递减次序排列的单链表&#xff0c;并要求利用原来两个单链表的节点存放归并后的单链表 算法思想 因为两链表已按元素值递增次序排列&#xff0…