MongoDB简介
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
MongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
官网:https://www.mongodb.com
指标项指标值说明
开发语言C++/
使用方式服务服务(独立运行)还是组件(代码集成)
部署方式支持Windows/Linux/Docker如果是服务,则是否支持 Windows/Linux/Docker 部署
许可协议SSPLApache/MIT/GNU/SSPL/...
是否有商业版有/
最近迭代时间2022/2/12该组件最后一次更新时间是什么时候
社区关注度21.2k该组件在 Github/Gitlab 中的 Star 数是多少
1.MongoDB主要特点
1.1文档数据库
使用文档的优点是
文档(即对象)对应于许多编程语言中的本机数据类型。
嵌入式文档和数组减少了对昂贵连接的需求。
动态模式支持流畅的多态性。
1.2高性能
MongDB提供高性能的数据持久性。特别是,
对嵌入式数据模型的支持减少了数据库系统上的 I/O活动。
索引支持更快的查询,并且可以包含来自嵌入文档和数组的键。
1.3高可用性
MongDB的复制工具,称为副本集(一组 MongoDB 服务器,它们维护相同的数据集,提供冗余并提高数据可用性),提供自动故障转移和数据冗余。
1.4 水平可扩展
MongoDB 提供水平可扩展性。
1.5支持多个存储引擎
MongoDB支持多种存储引擎:WiredTiger存储引擎(包括对静态加密的支持)和内存存储引擎。
此外,MongoDB 提供可插拔的存储引擎 API,允许第三方为 MongoDB 开发存储引擎。
2.1应用场景
1)社交场景,使用MongoDB存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
2)游戏场景,使用MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
3)物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将 订单所有的变更读取出来。
4)物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
5)视频直播,使用 MongoDB 存储用户信息、点赞互动信息等。
这些应用场景中,数据操作方面的共同特点是:
(1)数据量大
(2)写入操作频繁(读写都很频繁)
(3)价值较低的数据,对事务性要求不高
对于这样的数据,我们更适合使用MongoDB来实现数据的存储
https://pippichi.github.io/pdf/mongodb_base.pdf
2.MongoDB安装部署
2.1安装MongoDB
MongoDB安装预编译二进制包下载地址:https://www.mongodb.com/download-center/community
下载后进行安装,新版的MongoDB会主动在安装目录下创建log和data文件(旧版不会主动创建),但仍需要在data目录下创建db文件夹 C:\MongoDB\data\db
客户端安装成功后,在bin目录下打开cmd 执行mongo命令,出现以下情况便安装成功。
2.2安装Robo 3T/可视化工具
Robo 3T是MongoDB的客户端工具,我们可以使用它来操作MongoDB。
下载地址:https://robomongo.org/download
下载后找到合适目录进行解压即可,解压后双击exe文件
连接成功展示
查看数据也可以使用Navicat Premium 15 查看
2.3网页可视化工具mongo-express部署
mongo-express 是一个跨平台的用户界面 (GUI),可以处理您所有的 MongoDB 连接/数据库需求。mongo-express 使用 Node.js、Express 和 Bootstrap3 编写的基于 Web 的 MongoDB 管理界面,mongo-express只能用于私下开发。
下载地址:https://github.com/mongo-express/mongo-express
2.3.1特性
连接多个数据库
查看/添加/删除数据库
查看/添加/重命名/删除集合
查看/添加/更新/删除文档
在集合视图中预览音频/视频/图像资产
嵌套和/或大型对象可折叠以便于概览
大文档属性的异步按需加载(>100KB 默认)以保持集合视图快速
GridFS 支持 - 添加/获取/删除非常大的文件
在文档中使用 BSON 数据类型
移动/响应式 - 当您处于绑定状态时,Bootstrap 3 可以在小屏幕上正常运行
连接到各个数据库并进行身份验证
以管理员身份验证以查看所有数据库
数据库黑名单/白名单
自定义 CA 和 CA 验证禁用
支持副本集
2.3.2环境要求
使用mongo-express前需确认电脑上已经安装了 mongodb和nodejs环境。
NPM需要配置本公司的镜像源
# 设置镜像源
PS C:\Users\user>npmconfigsetregisty http://10.30.21.22:83/repository/npm-group/
# 查看镜像源
PS C:\Users\user>npmconfiggetregistry
http://10.30.21.22:83/repository/npm-group/
配置淘宝镜像源
$ npminstall-gcnpm--registry=https://registry.npmmirror.com
2.3.3安装mongo-express依赖
在解压后的mongo-express包目录下打开 cmd
npminstall
或者在cmd里面下载
npminstall mongo-express
2.3.4配置
进入到安装文件夹/node_modules/mongo-express目录下,此处已有文件config.default.js,此文件兼具配置模板文件,以及在没有config.js时起到默认配置文件的作用。
cpconfig.default.js config.js
#修改默认配置文件(参考)
module.exports={
mongodb: {
server:'localhost',
port: 你的mongodb端口,为安全起见,最好修改默认端口
//ssl: connect to the server using secure SSL
ssl: process.env.ME_CONFIG_MONGODB_SSL || mongo.ssl,
//sslValidate: validate mongod server certificate against CA
sslValidate: process.env.ME_CONFIG_MONGODB_SSLVALIDATE ||true,
//sslCA: array of valid CA certificates
sslCA: [],
//autoReconnect: automatically reconnectifconnection is lost
autoReconnect:true,
//poolSize: size of connection pool (number of connections to use)
poolSize:4,
//set admin totrueifyou want to turn on admin features
//if admin istrue, the auth list below will be ignored
//if admin istrue, you will need to enter an admin username/password below (if it is needed)
admin:true或false,true为admin登录,安全性考虑建议设为false
// >>>> If you are using regular accounts, fill out auth detailsinthe section below
// >>>> If you have admin auth, leave this section empty and skip to the next section
auth: [
/*
* Add the name, username, and password of the databases you want to connect to
* Add as many databases as you want!
*/
{
database:'要管理的数据库名称',
username:'此数据库管理员',
password:'管理员密码',
},
],
// >>>> If you are using an admin mongodb account, or no admin account exists, fill out section below
// >>>> Using an admin account allows you to view and edit all databases, and view stats
//如果上面的admin为true,这个地方填入admin信息
adminUsername:'*******',
adminPassword:'*******',
//whitelist: hide all databases except the onesinthis list (empty listforno whitelist)
whitelist: [],
//blacklist: hide databases listedinthe blacklist (empty listforno blacklist)
blacklist: [],
},
site: {
// baseUrl: the URL that mongo express will be located at-Remember to add the forward slash at thestartand end!
baseUrl: process.env.ME_CONFIG_SITE_BASEURL ||'/',
cookieKeyName:'mongo-express',
cookieSecret: process.env.ME_CONFIG_SITE_COOKIESECRET ||'cookiesecret',
host: process.env.VCAP_APP_HOST ||'你的服务器ip地址',//这个地方弄了很久,最后搞清楚是不带http的服务器地址
port: process.env.VCAP_APP_PORT || mongo-express 跑起来以后䣌端口号,默认是8081,最好改一下,
requestSizeLimit: process.env.ME_CONFIG_REQUEST_SIZE ||'50mb',
sessionSecret: process.env.ME_CONFIG_SITE_SESSIONSECRET ||'sessionsecret',
sslCert: process.env.ME_CONFIG_SITE_SSL_CRT_PATH ||'',
sslEnabled: process.env.ME_CONFIG_SITE_SSL_ENABLED ||false,
sslKey: process.env.ME_CONFIG_SITE_SSL_KEY_PATH ||'',
},
//set useBasicAuth totrueifyou want to authenticate mongo-express loggins
//if admin isfalse, the basicAuthInfo list below will be ignored
//this will betrueunless ME_CONFIG_BASICAUTH_USERNAME issetand is the empty string
useBasicAuth: process.env.ME_CONFIG_BASICAUTH_USERNAME !=='',
basicAuth: {
username: process.env.ME_CONFIG_BASICAUTH_USERNAME ||'mongo-express 登录用户名,最好改一下',
password: process.env.ME_CONFIG_BASICAUTH_PASSWORD ||'mongo-express 登录密码',
},
注:修改配置文件时,注意js文件格式
2.3.5运行
设置完成后,进入安装文件夹/node_modules/mongo-express,执行以下命令,运行成功。
npmstart
然后网页端访问服务器ip:定义的端口号, 会提示登录,按照设定的用密登录就可以进行管理。
2.3.6使用
1.创建数据表/集合
2.创建数据记录行/文档
2.4.Docker部署MongoDB
在Docker镜像仓库中查看MongoDB的可用版本:https://hub.docker.com/_/mongo?tab=tags&page=1
也可使用 docker search mongo 命令查看可用版本
2.4.1拉取镜像
docker pull mongo:latest
2.4.2创建容器
docker run -itd --name mongo-server -p 27017:27017 mongo --auth
参数说明:
-itd: 实际上是 -i -t -d 三个 Option 的组合,比较常用。
-i:以交互模式运行容器;
-t:为容器重新分配一个伪输入终端;
-d:后台运行容器,并返回容器ID;
--name mongo-server : 自定义容器名称
-p 27017:27017: 映射容器服务的 27017 端口到宿主机的 27017 端口。外部可以直接通过 宿主机 ip:27017 访问到 mongo 的服务。
--auth :需要密码才能访问容器服务,默认mongodb是不使用用户认证。
2.4.3启动容器
docker start mongo-server
2.4.4进入容器
docker exec -it mongo-server /bin/bash
#连接mongo,进入admin数据库
mongo
use admin
2.4.5docker-compose.yml文件
version: '3'
services:
mongodb:
image: mongo:latest
container_name: mongodb
restart: unless-stopped
ports:
- 27017:27017
volumes:
- mongodb_data:/data/db
mongo-express:
image: mongo-express:latest
restart: unless-stopped
environment:
ME_CONFIG_MONGODB_URL: mongodb://mongodb:27017/
ports:
- 8081:8081
depends_on:
- mongodb
volumes:
mongodb_data:
3.MongoDB基本操作
SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键
3.1数据库及表操作
#查询所有数据库
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
#通过use关键字切换数据库
> use admin
switched to db admin
#创建数据库
#说明:在MongoDB中,数据库是自动创建的,通过use切换到新数据库中,进行插入数据即可自动创建数据库
> use testdb
switched to db testdb
#并没有创建数据库
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
#插入数据
> db.user.insert({id:1,name:'zhangsan'})
WriteResult({ "nInserted" : 1 })
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
testdb 0.000GB #数据库自动创建
#查看表
> show tables
user
> show collections
user
#删除集合(表)
> db.user.drop()
true #如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
#删除数据库
> use testdb #先切换到要删除的数据库中
switched to db testdb
> db.dropDatabase() #删除数据库
{ "dropped" : "testdb", "ok" : 1 }
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
详细了解请参考:https://docs.mongodb.com/manual/crud/
3.2新增数据
在MongoDB中,存储的文档结构是一种类似于json的结构,称之为bson(全称为:Binary JSON)。
#插入数据
#语法:db.COLLECTION_NAME.insert(document)
> db.user.insert({id:1,username:'zhangsan',age:20})
WriteResult({ "nInserted" : 1 })
> db.user.save({id:2,username:'lisi',age:25})
WriteResult({ "nInserted" : 1 })
> db.user.find() #查询数据
{ "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "id" : 1, "username" : "zhangsan", "age" : 20 }
{ "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25 }
3.3更新数据
update() 方法用于更新已存在的文档。
#语法格式
db.collection.update(
,
,
[
upsert: ,
multi: ,
writeConcern:
]
)
参数说明:
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如,inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
> db.user.find()
{ "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "id" : 1, "username" : "zhangsan", "age" : 20 }
{ "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25 }
> db.user.update({id:1},{$set:{age:22}}) #更新数据
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find()
{ "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "id" : 1, "username" : "zhangsan", "age" : 22 }
{ "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25 }
#注意:如果这样写,会删除掉其他的字段
> db.user.update({id:1},{age:25})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find()
{ "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
{ "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25 }
#更新不存在的字段,会新增字段
> db.user.update({id:2},{$set:{sex:1}}) #更新数据
> db.user.find()
{ "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
{ "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25, "sex" : 1 }
#更新不存在的数据,默认不会新增数据
> db.user.update({id:3},{$set:{sex:1}})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
> db.user.find()
{ "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
{ "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25, "sex" : 1 }
#如果设置第一个参数为true,就是新增数据
> db.user.update({id:3},{$set:{sex:1}},true)
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5c08cb281418d073246bc642")
})
> db.user.find()
{ "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
{ "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25, "sex" : 1 }
{ "_id" : ObjectId("5c08cb281418d073246bc642"), "id" : 3, "sex" : 1 }
3.4删除数据
通过remove()方法进行删除数据
#语法格式
db.collection.remove(
,
{
justOne: ,
writeConcern:
}
)
参数说明:
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。
> db.user.remove({age:25})
WriteResult({ "nRemoved" : 2 }) #删除了2条数据
#插入4条测试数据
db.user.insert({id:1,username:'zhangsan',age:20})
db.user.insert({id:2,username:'lisi',age:21})
db.user.insert({id:3,username:'wangwu',age:22})
db.user.insert({id:4,username:'zhaoliu',age:22})
> db.user.remove({age:22},true)
WriteResult({ "nRemoved" : 1 }) #删除了1条数据
#删除所有数据
> db.user.remove({})
#说明:为了简化操作,官方推荐使用deleteOne()与deleteMany()进行删除数据操作。
db.user.deleteOne({id:1})
db.user.deleteMany({}) #删除所有数据
3.5查询数据
MongoDB 查询数据的语法格式如下:
#语法格式
db.user.find([query],[fields])
query :可选,使用查询操作符指定查询条件
fields :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
> db.col.find().pretty()
pretty() 方法以格式化的方式来显示所有文档。
条件查询:
操作格式范例RDBMS中的类似语句
等于{
小于{
小于或等于{
大于{
大于或等于{
不等于{
实例:
#插入测试数据
db.user.insert({id:1,username:'zhangsan',age:20})
db.user.insert({id:2,username:'lisi',age:21})
db.user.insert({id:3,username:'wangwu',age:22})
db.user.insert({id:4,username:'zhaoliu',age:22})
db.user.find() #查询全部数据
db.user.find({},{id:1,username:1}) #只查询id与username字段
db.user.find().count() #查询数据条数
db.user.find({id:1}) #查询id为1的数据
db.user.find({age:{$lte:21}}) #查询小于等于21的数据
db.user.find({age:{$lte:21}, id:{$gte:2}}) #and查询,age小于等于21并且id大于等于2
db.user.find({$or:[{id:1},{id:2}]}) #查询id=1 or id=2
#分页查询:Skip()跳过几条,limit()查询条数
db.user.find().limit(2).skip(1) #跳过1条数据,查询2条数据
db.user.find().sort({id:-1}) #按照age倒序排序,-1为倒序,1为正序
3.6索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
#查看索引
> db.user.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "testdb.user"
}
]
#说明:1表示升序创建索引,-1表示降序创建索引。
#创建索引
> db.user.createIndex({'age':1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
#删除索引
db.user.dropIndex("age_1")
#或者,删除除了_id之外的索引
db.user.dropIndexes()
#创建联合索引
db.user.createIndex({'age':1, 'id':-1})
#查看索引大小,单位:字节
db.user.totalIndexSize()
详细了解请参考:https://www.runoob.com/mongodb/mongodb-create-collection.html
4.SpringBoot整合MongoDB
Spring Data 对MongoDB做了支持,使用spring-data-mongodb可以简化MongoDB的操作。
地址:https://spring.io/projects/spring-data-mongodb
4.1导入mongodb坐标
org.springframework.boot
spring-boot-starter-data-mongodb
4.2编写配置文件
spring:
application:
name: mongo
data:
mongodb:
uri: "mongodb://localhost:27017/user"
4.3编写实体类
package com.supcon.mongodb.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bson.types.ObjectId;
/**
* @author NMW
* date 2022/2/12 10:41
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private ObjectId id;
private String name;
private int age;
private Address address;
}
package com.supcon.mongodb.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author NMW
* date 2022/2/12 10:42
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Address {
private String street;
private String city;
private String zip;
}
4.4编写dao层
package com.supcon.mongodb.dao;
import com.supcon.mongodb.pojo.User;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.CriteriaDefinition;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author NMW
* date 2022/2/12 10:44
*/
@Component
public class UserDao {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 新增数据
* @param user
*/
public void saveUser(User user){
this.mongoTemplate.save(user);
}
/**
* 根据姓名查询
* @param name
* @return
*/
public List queryUserByName(String name){
CriteriaDefinition criteriaDefinition;
Query query = Query.query(Criteria.where("name").is(name));
return this.mongoTemplate.find(query,User.class);
}
/**
* 根据页码查询
* @param page
* @param rows
* @return
*/
public List queryUserPageList(Integer page, Integer rows) {
Query query = new Query().limit(rows).skip((page - 1) * rows);
return this.mongoTemplate.find(query, User.class);
}
/**
* 更新数据
* @param user
* @return
*/
public UpdateResult update(User user) {
Query query = Query.query(Criteria.where("id").is(user.getId()));
Update update = Update.update("age", user.getAge());
return this.mongoTemplate.updateFirst(query, update, User.class);
}
/**
* 删除数据
* @param id
* @return
*/
public DeleteResult deleteById(String id) {
Query query = Query.query(Criteria.where("id").is(id));
return this.mongoTemplate.remove(query, User.class);
}
}
4.5编写单元测试
package com.supcon.mongodb.test;
import com.mongodb.client.result.DeleteResult;
import com.supcon.mongodb.dao.UserDao;
import com.supcon.mongodb.pojo.Address;
import com.supcon.mongodb.pojo.User;
import org.bson.types.ObjectId;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
/**
* @author NMW
* date 2022/2/12 11:03
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class MongoTest {
@Autowired
private UserDao userDao;
@Test
public void save(){
User user = new User();
user.setId(ObjectId.get());
user.setName("李四");
user.setAge(24);
user.setAddress(new Address("人民路","河南省","66666"));
userDao.saveUser(user);
}
@Test
public void testQuery() {
List userList = this.userDao.queryUserByName("张三");
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void queryTest01(){
List users = userDao.queryUserPageList(1, 4);
for (User user : users) {
System.out.println(user);
}
}
@Test
public void testUpdate() {
User user = new User();
user.setId(new ObjectId("6207252bb95631637ecc0272"));
user.setAge(30);
this.userDao.update(user);
}
@Test
public void testDelete(){
DeleteResult deleteResult = this.userDao.deleteById("6207252bb95631637ecc0272");
System.out.println(deleteResult);
}
}