MongoDB:简单的增删改查操作
一.概述
本篇文章介绍在Navicat中对MongoDB数据库进行增删改查操作,在后面会介绍在Spring Boot中使用MongoTemplate对MongoDB数据库进行相关操作.如有必要可以先看看前面几篇文章.
MongoDB:MySQL,Redis,ES,MongoDB的应用场景
MongoDB:数据库初步应用
二.在Navicat进行增删改查操作
2.1 新增数据
MongoDB有以下几种方法对数据进行新增.
1) insert() 插入单个或者多个数据(文档);
2) save() 如果新新增数据主键存在那么就修改,如果不存在就新增.
3) insertOne()新增一条数据
4) insertMany()新增多条数据.
其中insertOne,insertMany与insert()的功能重复,所以这里就不多做介绍了.
2.1.1 insert()新增数据
示例代码如下:
db.user_search_record.insert({uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"剪纸用品",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"}
)
对照语法格式如下:
db.集合名称.insert(JSON格式的键值对
)
这里需要主要的是db不能省略,不然会提示集合(表)名称未定义.
在上面案例中ISODate()获得的是格林威治时间,需要在上面+8才能获得北京时间,时间格式时候yyyy-MM-dd HH:mm:ss
下面代码添加多条记录,多条记录需要用 [ ] 符号,表示是一个数组.
db.user_search_record.insert([
{uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"日用商品",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"},
{uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"食品",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"},
])
在MongoDB的集合中存在_id字段,作为文档的主键,如果没有指定,会自动生成.
2.1.2 使用save()保存文档
save()的语法格式与insert()格式类似,示例代码如下:
db.user_search_record.save({uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"现切水果",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"}
)
上面代码没有指定_id所以等同于insert(),将新增一条代码.如果我们指定_id,将判断_id是否存在,如果存在那么就修改原数据,如果不存在,那么新增,示例代码如下:
db.user_search_record.save({_id:ObjectId("64dc2cc9045b0000260056f5"),uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"绿叶水果",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"}
)
在上面代码中需要注意_id是MongoDB特有的数据类型:ObjectId,所以需要用到ObjectId()这个方法对字符串进行转换,并且不能省略.如果上面的_id存在将对数据进行修改,如果不存在那么将新增.
与insert()不同的是save()一次只能操作一条数据.
2.2 更新数据
更新数据常见的方法有update(),save(),updateOne(),updateMany(),replaceOne().其中save在上面已经介绍了,
2.2.1 update()更新数据
下面代码使用update方法更新数据
db.product_detail.update(
{_id:ObjectId("64db394fd5b10c163f4ce01d")},
{$set:{title:"正宗山东烟台红富士又红又甜 顺丰包邮"}}
)
其语法格式如下:
db.product_detail.update(
{查询条件},
{$set:更新字段}
)
在上面的更新中,默认只会更新匹配到的第一条语句,如果需要更新所有匹配到的语句需要设置multi为true,这个值默认为false(不进行多条语句更新),示例如下面的代码将更新多条匹配的语句:
db.product_detail.update(
{title:"享受正宗的新疆李子美味"},
{$set:{title:"正宗的新疆李子顺丰包邮到家 皮薄美味丰富维C"}},
{multi:true}
)
2.2.2 其它更新语法介绍
其它更新语法不常用,只做简单介绍,updateOne()只更新匹配到的第一条语句,updateMany()更新多条语句,reaplaceOne()只更新匹配到的第一条语句.
2.3 删除数据
MongoDB中删除也有多种方法:remove(),deleteOne(),deleteMany(),最常用的是remove()方法.
2.3.1 remove()方法删除数据
remove的语法与update语法有相似之处,示例代码如下:
db.user_search_record.remove(
{_id:ObjectId("64db3bf7d5b10c163f5469d5")},
{justOne:true}
)
其语法格式如下:
db.集合名称.remove(
{筛选条件},
{可选参数}
)
在上面的代码中justOne:true表示只删除一条数据,这个值默认为false,也就是会删除所有匹配到的数据.在做删除之前最好先根据删除条件做一次查询,避免被误删.
2.3.3 其它删除方法
deleteOne()一次删除一个文档
deleteMany()一次删除多条匹配到的文档.
上面这两个方法都可以用remove()代替.
2.4 基本查询
任何数据库中查询是所有操作中最重要和常用的环节,我们需要从以下几个方面逐步了解
2.4.1 比较操作符
在前面的操作中,我们已经发现了mongoDB以$作为关键字的标志,这查询中也是一样.
$eq : 查询相等
$ne: 查询不相等
$gt, $gte: 查询大于,大于等于条件的文档
$lt, $lte : 查询小于, 小于等于条件的文档
$in, $nin: 查询条件必须是数组, 查询存在或者不存在这个数组里面值的文档.
2.4.2 逻辑操作符
$and : 用于多条件查询,表示并且
$or : 用于多条件查询,表示或
$nor : 用于多条件查询,表示查询文档必须不符合所有条件
$not : 只能用于一个条件查询,表示文档不符合查询条件.
2.4.3 元素操作符
$exists: 判断指定字段是否存在.
$type: 判断指定字段的数据类型
使用find()方法进行查询,案例如下:
db.product_detail.find({$and:[ //and中列出了三个条件必须都要满足{categoryId:{$eq:32}}, {productRating:{$gte:4.9}}, {shopId:{$not:{$eq:"4d3f317917543ab3c1ebed6300453f69"}}}],$or:[ //or列出了两个条件,必须满足其中一个{positiveReviews:{$gte:300}}, {badReviews:{$lt:10}}]}
)
find方法接受一个json数据,其中$and和$or作为数据中的两个属性,这两个属性可以接受数组作为属性值.
2.4.4 模糊查询
在mongoDB中,模糊查询是采用的正则表达式的方式,例如下面的代码:
db.product_detail.find({$and:[{address:"深圳"},{productRating:{$gte:4.5}},{title:{$regex:"西瓜",$options:["i","x","s"]} }]}
)
$regex:"西 瓜" 是指定title字段需要模糊匹配西瓜这两个字.
$options:是设置可选参数, i表示忽略大小写,x表示忽略空格,s表示忽略换行.
三.Spring Boot 对MongoDB进行增删改查
先引用mongoTemplate
@Resource
private MongoTemplate mongoTemplate; //mongoDB操作模板
3.1 新增文档
/*** 添加用户的收货地址* @param userAddress* @return 返回主键*/@Overridepublic String addAddress(UserAddress userAddress){//向集合中添加数据,如果没有指定_id,那么会自动生成userAddress = mongoTemplate.insert(userAddress);//返回生成的uidreturn userAddress.get_id();}
3.2 更新文档
/*** 更新用户的收货地址* @param userAddress* @return*/@Overridepublic boolean updateAddress(UserAddress userAddress){//创建查询对象Query query = new Query();//根据主键创建查询语句query.addCriteria(Criteria.where("_id").is(userAddress.get_id()));//创建更新对象Update update = new Update();//根据键值对添加更新数据update.set("address",userAddress.getAddress());update.set("province",userAddress.getProvince());update.set("tel",userAddress.getTel());update.set("city",userAddress.getCity());update.set("recipient",userAddress.getRecipient());update.set("isDefault",userAddress.getIsDefault());//将检索出来的对象进行更新UpdateResult result = mongoTemplate.updateFirst(query,update,UserAddress.class);//判断被修改的文档数据量if(result.getModifiedCount()>0){return true;}else{return false;}}
3.3 删除文档
/*** 根据主键编号移除用户的收货地址:实际操作为将用户的收货地址的isDelete值改为true(1)* @param id* @return true:成功*/@Overridepublic boolean removeAddress(String id){//创建查询标准Query query = new Query();query.addCriteria(Criteria.where("_id").is(id));//将数据的isDeleted字段改为trueUpdate update = new Update();update.set("isDeleted",Byte.valueOf("1"));UpdateResult result = mongoTemplate.updateFirst(query,update,UserAddress.class);if(result.getModifiedCount()>0){return true;}else{return false;}}
3.4 查询文档
/*** 根据用户id查询这个用户的所有收货地址* @param uid 用户id* @return 收货地址集合*/@Overridepublic List<UserAddress> getAddressByUserId(String uid) {//创建查询对象Query query = new Query();//配置查询标准query.addCriteria(Criteria.where("userId").is(uid));List<UserAddress> list = mongoTemplate.find(query,UserAddress.class);return list;}/*** 根据主键编号查询收货地址* @param id* @return*/@Overridepublic UserAddress getAddressById(String id){//创建查询标准Query query = new Query();query.addCriteria(Criteria.where("_id").is(id));//根据主键查询值需要返回一个对象UserAddress userAddress = mongoTemplate.findOne(query,UserAddress.class);return userAddress;}
相关文章:
MongoDB:简单的增删改查操作
一.概述 本篇文章介绍在Navicat中对MongoDB数据库进行增删改查操作,在后面会介绍在Spring Boot中使用MongoTemplate对MongoDB数据库进行相关操作.如有必要可以先看看前面几篇文章. MongoDB:MySQL,Redis,ES,MongoDB的应用场景 MongoDB:数据库初步应用 二.在Navicat进行增删改…...
网络编程(域套接字)
一、域套接字的概念 1.只能做一台主机内的进程间通信,协议族(地址族)指定为:AF_UNIX AF_LOCAL 2.bsp-lcd: s类型文件,就是域套接字 3.如果客户端不手动绑定,则操作系统不会创建一个套接字文件…...
探索短视频小程序/小年糕
短视频小程序的兴起,为创作者提供了一个全新的平台,让他们能够以更专业的方式展现自己的作品。这种创作形式不仅要求作品内容足够精彩还需要有深度的思考和逻辑性的呈现。本文将探索短视频小程序的专业与深度的创作之道,帮助创作者更好地发挥…...
基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 7 Function callers标签页介绍
不知不觉这个code-mapping专题已经写了6篇文章了,今天是我们这个专题的最后一篇文章了介绍Function callers 这个其实很简单,以前的文章里也有提到CS接口实现两个SWC之间的CS调用,我们在从Code-mapping的角度在说下 首先还是看下模型 我们还记得在simulink里我们用function…...
ARM开发(cortex-A7核中断实验)
1.实验目的:实现KEY1/LEY2/KE3三个按键,中断触发打印一句话,并且灯的状态取反; key1 ----> LED3灯状态取反; key2 ----> LED2灯状态取反; key3 ----> LED1灯状态取反; 2.分析框图: …...
关于融合项目点云pointpillars检测不显示三维检测框问题的解决
这个问题主要还是launch文件中出现了一些偏差。 launch文件的第26行 这里原先是0.6,在检测kitti的时候是0.6,由于kitti是64线激光雷达,我个人用的是16线激光雷达,所以把0.6降到了0.2.出现了三维检测框,问题解决...
spring复习:(57)PropertyOverrideConfigurer用法及工作原理
一、属性配置文件 dataSource.urljdbc:mysql://xxx.xxx.xxx.xxx/test dataSource.usernameroot dataSource.passwordxxxxxx dataSource.driverClassNamecom.mysql.jdbc.Driver #dataSource.typecom.alibaba.druid.pool.DruidDataSource二、spring配置文件 <?xml version&…...
在axios中获取文件上传进度
1.在axios 全局配置的文件中加入一个postFile 方法在上传文件时调用。 export function postFile(url, params,config) {return new Promise((resolve, reject) > {axios.post(url, params,config).then(res > {resolve(res);}).catch(err > {reject(err);})}) } 2.…...
黑马头条-kafka配置
生产者配置 NAMEDESCRIPTIONTYPEDEFAULTVALID VALUESIMPORTANCEbootstrap.servershost/port列表,用于初始化建立和Kafka集群的连接。列表格式为host1:port1,host2:port2,…,无需添加所有的集群地址,kafka会根据提供的地址发现其他的地址&…...
PMP P-01 Basic Knowledge
PMP基础知识...
java八股文面试[数据结构]——ArrayList和LinkedList区别
ArrayList和LinkedList的异同 二者的线程都不安全,相对线程安全的Vector,执行效率高。此外,ArrayList时实现了基于动态数组的数据结构,LinkedList基于链表的数据结构,对于随机访问get和set,ArrayList觉得优于LinkedLis…...
OpenCV中QR二维码的生成与识别(CIS摄像头解析)
1、QR概述 QR(Quick Response)属于二维条码的一种,意思是快速响应的意思。QR码不仅信息容量大、可靠性高、成本低,还可表示汉字及图像等多种文字信息、其保密防伪性强而且使用非常方便。更重要的是QR码这项技术是开源的,在移动支付、电影票、…...
常见排序集锦-C语言实现数据结构
目录 排序的概念 常见排序集锦 1.直接插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 hoare 挖坑法 前后指针法 非递归 7.归并排序 非递归 排序实现接口 算法复杂度与稳定性分析 排序的概念 排序 :所谓排序,就是使一串记录&#…...
css 实现四角边框样式
效果如图 此图只实现 左下与右下边角样式 右上与左上同理 /* 容器 */ .card-mini {position: relative; } /* 左下*/ .card-mini::before {content: ;position: absolute;left: 0;bottom: 0;width: 20px;height: 20px;border-bottom: 2px solid #253d64;border-left: 2px so…...
机器学习深度学习——自注意力和位置编码(数学推导+代码实现)
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——注意力分数(详细数学推导代码实现) 📚订阅专栏:机器学习…...
02.案列项目Demo
1.创建项目 1. 创建项目 用pycharm 选择对应的编译器,输入对应的文件名,点击创建项目。删除默认外层生成的template和DIRS 配置项: 2. 创建App 创建appo1的命令: python manage.py startapp app01 如果使用pycharm>tool>…...
PDF校对:追求文档的精准与完美
随着数字化时代的到来,PDF已经成为了多数机构和个人首选的文件格式,原因在于它的稳定性、跨平台特性以及统一的显示效果。但是,对于任何需要公开或正式发布的文档,确保其内容的准确性是至关重要的,这就是PDF校对显得尤…...
低代码解放生产力,助力企业高效发展
近年来,随着数字化转型的推进,企业对于软件开发的需求日益显著。然而,传统的软件开发模式通常需要耗费大量时间和资源,限制了企业的快速响应能力。为了解决这一难题,低代码开发平台应运而生,成为企业和开发…...
【前端从0开始】CSS——9、浮动
1. 浮动(float) 1.1 定义 float 属性定义元素向哪个方向浮动。之前这个属性应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动。浮动元素会生成一个块级框,不论它本身是何种元素。 取值…...
如何在Moonriver网络上向社区代表委托投票权利
我们之前介绍了「社区代表」这一概念,想必大家对社区代表在治理中扮演的角色和地位有了一定的了解。 本文将介绍如何将您的投票权利委托给社区代表。请注意,在委托Token给社区代表这一过程中,并非将您的Token转移给任何人,而且此…...
时序预测 | MATLAB实现基于CNN-GRU卷积门控循环单元的时间序列预测-递归预测未来(多指标评价)
时序预测 | MATLAB实现基于CNN-GRU卷积门控循环单元的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-GRU卷积门控循环单元的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 MATLAB实现基于CNN-GRU卷积…...
【李群李代数】李群控制器(lie-group-controllers)介绍——控制 SO(3) 空间中的系统的比例控制器Demo...
李群控制器SO(3)测试 测试代码是一个用于控制 SO(3) 空间中的系统的比例控制器。它通过计算控制策略来使当前状态逼近期望状态。该控制器使用比例增益 kp 进行参数化,然后进行一系列迭代以更新系统状态,最终检查状态误差是否小于给定的阈值。这个控制器用…...
DP读书:鲲鹏处理器 架构与编程(六)PCI Express 总线
处理器与服务器:PCI Express 总线 PCI Express 总线1. PCI Express 总线的特点a. 高速差分传输b. 串行传输c. 全双工端到端连接d. 基于多通道的数据传输方式e. 基于数据包的传输 2. PCI Express 总线的组成与拓扑结构a. 根复合体b. PCI Express桥c. 功能单元 3. PCI…...
Pyqt5-开源工具分解功能(文本拖拽)
开源第四篇:功能实现之拖拽功能与配置文件。 写这个功能的初衷,是因为,每次调试我都要手动敲命令,太麻烦了,想偷个懒,所以直接给这功能加上了,顺便衍生出了另一个想法,配置文件自动填写相关数据。 先看个简单的拖拽功能: 很明显吧,还是比较便捷的。所以我们本章,就在…...
Java版B/S架构 智慧工地源码,PC、移动、数据可视化智慧大屏端源码
智慧工地是什么?智慧工地主要围绕绿色施工、安全管控、劳务管理、智能管理、集成总控等方面,帮助工地解决运营、管理方面各个难点痛点。在互联网的加持下促进项目现场管理的创新与发展,实现工程管理人员与工程施工现场的整合,构建…...
无涯教程-PHP - Session选项
从PHP7 起, session_start()()函数接受一系列选项,以覆盖在 php.ini 中设置的会话配置指令。这些选项支持 session.lazy_write ,默认情况下此函数为on,如果会话数据已更改,则会导致PHP覆盖任何会话文件。 添加的另一个…...
The Age of Data and AI: Challenges and Opportunities
Simply put Abstract: This paper examines the impact of the “Age of Data” on the field of artificial intelligence (AI). With the proliferation of digital technologies and advancements in data collection, storage, and processing, organizations now have ac…...
WPF 项目中 MVVM模式 的简单例子说明
一、概述 MVVM 是 Model view viewModel 的简写。MVVM模式有助于将应用程序的业务和表示逻辑与用户界面清晰分离。 几个概念的说明: model :数据,界面中需要的数据,最好不要加逻辑代码view : 视图就是用户看到的UI结构 xaml 文件viewModel …...
基于nginx禁用访问ip
一、背景 网络安全防护时,禁用部分访问ip,基于nginx可快速简单实现禁用。 二、操作 1、创建 conf.d文件夹 在nginx conf 目录下创建conf.d文件夹 Nginx 扩展配置文件一般在conf.d mkdir conf.d 2、新建blocksip.conf文件 在conf.d目录新建禁用ip的扩展配置文…...
【第三阶段】kotlin语言的内置函数let
1.使用普通方法对集合的第一个元素相加 fun main() {//使用普通方法对集合的第一个元素相加var list listOf(1,2,3,4,5)var value1list.first()var resultvalue1value1println(result) }执行结果 2.使用let内置函数对集合的第一个元素相加 package Stage3fun main() {//使用…...
dede 添加演示网站/怎么申请域名建立网站
目录(1)对于异步 I/O 操作的需求(2)异步 I/O API超时处理结果的顺序事件时间容错保证(3)代码实现(1)对于异步 I/O 操作的需求 在与外部系统交互(用数据库中的数据扩充流…...
德阳哪里有做网站的/广州seo关键字推广
Easy-表格数据1CodeNamePrice001name12323002name24612003name34612通过数据请求创建表格看到URL:属性 在背后解析时就是一个AJAX $.GET(XXXX)定义表格,并且通过url访问json数据, fitColumns:true表示自动适应,singleSelect:true 表示选中单个…...
电子商务网站管理系统/河南品牌网络推广外包
分析FileInputStream,其中finalize()被覆写,优先使用finalize(),close()方法可能内存泄漏,或者手动colse()之前做好检查package java.io;import java.nio.channels.FileChannel;import sun.nio.ch.FileChannelImpl;/*** A FileInputStream ob…...
软件开发工具包sdk/太原seo网站优化
首先看一下epoll的几个函数的介绍。1、epoll_create函数/*** brief 该函数生成一个epoll专用的文件描述符。它其实是在内核申请一空间,用来存* 放你想关注的socket fd上是否发生以及发生了什么事件。* param size: size就是你在这个epoll fd上能关注的最大socket fd…...
化妆培训学校网站开发/seo建站优化推广
谈到企业级自助分析平台,大家自然会想到Tableau,在Garnter最新的BI平台魔力象限中,是这么描述Tableau的。 “Tableau is a Leader in this Magic Quadrant. It offers a visual-based exploration experience that enables business users to…...
网站建设后台/seo的优点和缺点
1.SQLAIchemy介绍SQLAlchemy是python编程下的一款ORM框架,该框架是建立在数据库API文档上,使用关系对象映射进行数据库操作,简言之便:将对象转换成sql,然后使用API并获取执行结果2.SQLAIchemy安装pip install SQLAlchemy3.常用SQLAIchemy函数(python) #创建数据链接 MySQL-Pyth…...