Java-MongoDB-API

0、前置工作

创建Maven工程,导入依赖:

<dependency><groupId>org.mongodb</groupId><artifactId>mongo-java-driver</artifactId><version>3.12.7</version></dependency>

1、连接MongoDB并测试

注意:确保已经启动MongoDB,最好是把MongoDB设置为自启程序。

//连接MongoDB服务器,自带连接池效果MongoClient mongoClient = MongoClients.create("mongodb://127.0.0.1:27017");//获取数据库,如果数据库不存在,为该数据库存储数据时自动创建数据库。MongoDatabase database = mongoClient.getDatabase("test");//获取集合,如果集合不存在,首次存储数据时,自动创建集合MongoCollection<Document> collection = database.getCollection("teachers");//获取数据,获取集合中第一个文档,并转为json打印System.out.println(collection.find().first().toJson());    //测试//关闭客户端if (mongoClient != null){mongoClient.close();}

如果有用户名和密码的话,连接的地址应该修改为:

mongodb://username:password@host/?authSource=admin

2、Java 操作集合

2.1、创建集合

创建集合有多种方式:创建普通的集合,创建固定大小的集合(capped)、创建带校验规则的集合:

1、创建普通集合

/*** 创建无限定集合* @param name 集合名称*/public void createCollection(String name){database.createCollection(name);}

2、创建固定大小的集合

/*** 创建固定大小的集合* @param name 集合名称* @param size 集合大小*/public void createCollection(String name,long size){database.createCollection(name,new CreateCollectionOptions().capped(true).sizeInBytes(size));}

3、创建带校验规则的集合

 /*** 创建带校验规则的集合* 在插入文档时必须存在两个字段:existsFiledName1和existsFiledName2* @param name 集合名称* @param existsFiledName1 字段1* @param existsFiledName2 字段2*/public void createCollectionWithFilter(String name,String existsFiledName1,String existsFiledName2){ValidationOptions validationOptions = new ValidationOptions().validator(Filters.or(Filters.exists(existsFiledName1), Filters.exists(existsFiledName2)));database.createCollection(name,new CreateCollectionOptions().validationOptions(validationOptions));}

 

2.2、获取集合

 public MongoCollection<Document> getCollection(String name){return database.getCollection(name);}

2.3、删除集合

/*** 删除集合*/public void dropCollection(String collectionName){MongoCollection<Document> collection = getCollection(collectionName);collection.drop();}

3、Java 操作文档

3.1、插入单个文档

/*** 插入一个文档* 创建一个文档对象,参数可以接收键值对,也可以直接接收一个Map对象* 文档对象的本质是BSON类型,还类型对应java中的Map,BSON数组对应Java中的List* Document.append(String key,Object value);    键指的是字段名 值可以是字符串可以是Document对象或者List数组*/public void insertDocument(String collectionName,Map<String,Object> map){Document doc = new Document();for (String key : map.keySet()) {doc.append(key,map.get(key));}MongoCollection<Document> collection = getCollection(collectionName);collection.insertOne(doc);}

3.2、插入多个文档

/*** 插入多个文档*/public void insertDocuments(String collectionName,List<Document> documents){MongoCollection<Document> collection = getCollection(collectionName);collection.insertMany(documents);}

3.3、修改单个文档

这里用的是 Filters.eq() 相当于判断是否等于,如果有数值型的字段,可以用Filters.lt() 表示小于、Filters.gt() 表示大于...

 /**** @param collectionName 集合名称* @param conditionFiledName 查询条件字段名* @param value 查询条件字段对应的值* @param updateList 更新后的字段键值对列表 注意:这里需要传入一个List<Document>集合,其中,Document对象的key应该为"$set",值为新的Document对象*/public void updateDocument(String collectionName,String conditionFiledName,String value,List<Document> updateList){MongoCollection<Document> collection = getCollection(collectionName);collection.updateOne(Filters.eq(conditionFiledName,value),updateList);}

3.4、修改多个文档

//修改多个文档 所有订单数量<100的订单全部+1MongoCollection<Document> collection = getCollection("orders");
//给满足条件的订单的订单数目全部+100UpdateResult updateResult = collection.updateMany(Filters.eq("order_nums",100), Updates.inc("order_nums", 100));System.out.println(updateResult.getModifiedCount());

3.5、删除文档

 //删除单个条件文档MongoCollection<Document> collection = getCollection("orders");collection.deleteOne(Filters.eq("order_id","0003"));
//删除多个满足条件文档
collection.deleteOne(Filters.eq("order_num","100"));

4、Java 查询文档

4.1、查询所有文档

MongoCollection<Document> collection = getCollection("students");//查询所有文档MongoCursor<Document> cursor = collection.find().iterator();
//        MongoCursor<Document> cursor = collection.find().limit(100);//只看前100行
//        MongoCursor<Document> cursor = collection.find().first();//只看第一行try {while (cursor.hasNext()) {System.out.println(cursor.next().toJson());}}finally {cursor.close();}

4.2、条件查询

主要依靠Filters类进行拦截过滤。

//多条件查询 60<=score<80 并且 address="山西"(如果address是数组,则"山西"包含在内即可)FindIterable<Document> documents = collection.find(new Document("score", new Document("$gte", 60).append("$lt", 80)).append("address", "山西"));//等价于上面的collection.find(Filters.and(Filters.gte("score",60),Filters.lt("score",80),Filters.eq("address","山西")));

4.3、投影

投影就是选择展示的字段,因为默认是全部展示的。即使设置了想要展示的字段,"_id"字段也会被展示,需要用专门指定"_id"为0或者使用 Projections.excludeId()。

 //投影collection.find(Filters.eq("name","李大喜")).projection(new Document("name",1).append("sex",1).append("age",1).append("_id",0));//等价于上面的投影 Projections.excludeId() 不展示 _idcollection.find(Filters.eq("name","李大喜")).projection(Projections.fields(Projections.include("name","sex","age"),Projections.excludeId()));

 

4.4、排序

//排序 先按照年龄排序 年龄一样的安照工资排序//asc 升序//desc 降序collection.find(Filters.lt("age",50)).sort(Sorts.ascending("age","sal"));

 

 

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

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

相关文章

如何在PHP中使用数字

引言 数字在编程中非常常见。它们用于表示屏幕尺寸尺寸、地理位置、金钱、点数、视频中经过的时间、游戏角色的位置和通过分配数字代码的颜色等内容。 能够在编程中有效地执行数学运算是一项需要开发的重要技能&#xff0c;因为你将经常与数字打交道。虽然对数学的深入理解肯…

VMware Workstation Pro 无法使用开机状态下拍的快照来克隆虚拟机,怎么解决?

环境: VMware Workstation Pro16.0 Win10 专业版 问题描述: VMware Workstation Pro有台虚拟机在开机状态下拍了个6.7快照这个win10初始版,现在想在这个快照下直接克隆,无法使用开机状态下拍的快照创建克隆 解决方案: 1.关闭当前虚拟机 2.到虚拟机文件夹复制一份Wind…

Python 在logging.config.dictConfig()日志配置方式下,使用自定义的Handler处理程序

文章目录 一、基于 RotatingFileHandler 的自定义处理程序二、基于 TimedRotatingFileHandler 的自定义处理程序 Python logging模块的基本使用、进阶使用详解 Python logging.handlers模块&#xff0c;RotatingFileHandler、TimedRotatingFileHandler 处理器各参数详细介绍 …

kingbase(人大金仓)数据库的常用知识点与简单巡检

查看服务是否已设为开机自启 systemctl list-dependencies |grep kingbasehttps://blog.csdn.net/gyqailxj/article/details/127290687

Apache Doris 入门教程36:文件分析和文件缓存

文件分析 通过 Table Value Function 功能&#xff0c;Doris 可以直接将对象存储或 HDFS 上的文件作为 Table 进行查询分析。并且支持自动的列类型推断。 使用方式​ 更多使用方式可参阅 Table Value Function 文档&#xff1a; S3&#xff1a;支持 S3 兼容的对象存储上的文…

智能电视与win10电脑后续无法实现DLNA屏幕共享

问题背景&#xff1a; 我用的是TCL电视&#xff0c;但是并不是最新&#xff0c;打开的方式是U盘->电脑&#xff0c;各位看自己情况&#xff0c;很多问题都大概率是智能电视问题。 情景假设&#xff1a; 假设你已经完成原先智能电视该有的步骤&#xff0c;通过DLNA&#xf…

第8天----【位运算进阶之----异或(^)】

今天我们来学习C语言中的异或。 文章目录 一、基本知识&#xff1a;异或操作满足的定律&#xff1a;(important) 二、拓展应用&#xff1a;1. 交换两个变量的值&#xff1a;2. 判断两个数的奇偶性&#xff1a;3. 检测落单的数(出现奇数次的数)&#xff1a;检测丢失的数: 4. 加密…

TCP/UDP/IP协议简介

IP协议简介 特指为实现一个相互连接的网络系统上从源地址到目的地址传输数据包(互联网数据包) 所提供必要功能的协议 特点&#xff1a; 不可靠&#xff1a;不能保证IP数据包能够成功的到达它的目的地只能提供尽力而为的传输服务。 无连接&#xff1a;IP并不维护任何关于后续数…

vue3中reactive和ref的比较

1.reactive和ref函数的共同作用是什么&#xff1f; 用函数调用的方式生成响应式数据 2. reactive vs ref? 1.reactive不能处理简单类型的数据 2.ref参数类型支持更好但是必须通过.value访问修改 3.ref函数的内部实现依赖于reactive函数 3. 在实际工作中推荐使用哪个? …

rust写一个多线程和协程的例子

当涉及到多线程和协程时&#xff0c;Rust提供了一些非常强大的工具&#xff0c;其中最常用的库之一是tokio&#xff0c;它用于异步编程和协程。下面我将为你展示一个简单的Rust程序&#xff0c;演示如何使用多线程和协程。 首先&#xff0c;你需要在你的项目的Cargo.toml文件中…

Java学习笔记——(22)什么叫表达式、语句

关于这个问题不要觉得不重要&#xff0c;其实大有可以说的地方&#xff0c;这是一个很基础的东西&#xff0c;却有很多人都不是很清楚得了解。 表达式 是由运算符和运算对象组成的,单独的一个运算对象(常量/变量)也可以叫做表达式&#xff0c;这是最简单的表达式. eg.4,42,c…

SLAM-VIO视觉惯性里程计

SLAM 文章目录 SLAM前言IMU与视觉比较单目视觉缺陷&#xff1a;融合IMU优势&#xff1a;相机-IMU标定松耦合紧耦合基于滤波的融合方案&#xff1a;基于优化的融合方案&#xff1a; 前言 VIO&#xff08;visual-inertial odometry&#xff09;即视觉惯性里程计&#xff0c;有时…

java电子病历源码 电子病历编辑器源码 病历在线制作、管理和使用

电子病历在线制作、管理和使用的一体化电子病历解决方案&#xff0c;通过一体化的设计&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。电子病历系统将临床医护需要的诊疗资料以符合临床思维的方法展示。建立以病人为中心&#xff0c;以临床诊疗信息为主线…

Git企业开发控制理论和实操-从入门到深入(二)|Git的基本操作

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/cate…

3d max插件CG MAGIC中的蜂窝材质功能可提升效率吗?

工作中能提升效率也都是大家所想的&#xff0c;对于设计师的一个设计过程中&#xff0c;可能想怎么样可以更快呀&#xff0c;是哪个步骤慢了呢&#xff1f; 这样的结果只能说会很多&#xff0c;但是建模这个步骤&#xff0c;肯定是有多无少的。 为了让模型更加逼真&#xff0c…

HDLBits-Verilog学习记录 | Verilog Language-Basics(2)

文章目录 9.Declaring wires | wire decl10. 7458 chip 9.Declaring wires | wire decl problem:Implement the following circuit. Create two intermediate wires (named anything you want) to connect the AND and OR gates together. Note that the wire that feeds the …

2023国赛数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

行业追踪,2023-08-23

自动复盘 2023-08-23 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

uview2.0自定义tabbar

tabbar组件 <template><u-tabbar :value"tab" change"changeTab" :fixed"true" :border"true" :placeholder"true":safeAreaInsetBottom"true"><u-tabbar-item text"消息" icon"c…

缓存的变更(JVM本地缓存->Redis分布式缓存)

在一次需求修改中&#xff0c;下游的服务附加提出了&#xff0c;针对某个业务数据缓存的生效时间的要求 原JVM设计方案&#xff1a; 采用jvm本地缓存机制&#xff0c;定时任务30秒刷新一次 现在redis方案&#xff1a; 因为很多地方使用了这个业务数据缓存&#xff0c;使用方…