MongoDB

最近进行MongoDB开发,虽然需求比较简单,但是涉及较多的细节使用。加之不够熟悉 就使用了各种方法达到目标。

1.简介

MongoDB是一个基于分布式文件存储的数据库,一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。支持比较丰富和复杂的数据类型。

MongoDB已经在多个站点部署,其主要场景如下:

1)网站实时数据处理。它非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

2)缓存。由于性能很高,它适合作为信息基础设施的缓存层。在系统重启之后,由它搭建的持久化缓存层可以避免下层的数据源过载。

3)高伸缩性的场景。非常适合由数十或数百台服务器组成的数据库,它的路线图中已经包含对MapReduce引擎的内置支持。

不适用的场景如下:

1)要求高度事务性的系统。

2)传统的商业智能应用。

3)复杂的跨文档(表)级联查询。

2.使用

连接和认证——方式一( MongoClient )

使用mongoclient的方式。MongoClient是线程安全的,可以在多程程环境中共享同一个MongoClient。通常来说,一个应用程序中,只需要生成一个全局的MongoClient实例,然后在程序的其他地方使用这个实例即可。

直接连接:

MongoClient mongoClient = new MongoClient("localhost", 27017); // 获取链接
MongoDatabase database = mongoClient.getDatabase("mydb"); // 获取数据库

认证与连接:

MongoClientOptions.Builder builder = MongoClientOptions.builder(); //可以通过builder做各种详细配置 MongoClientOptions myOptions = builder.build();

ArrayList<ServerAddress> serverAddressList = new ArrayList();

ServerAddress record = new ServerAddress("localhost", 27017); //IP、端口

serverAddressList.add(record); //用户名、默认库名、密码

MongoCredential credential = MongoCredential.createCredential("账号", "默认库名", "密码".toCharArray());

MongoClient mongoClient = new MongoClient(serverAddressList, credential, myOptions);

连接和认证——方式二( MongoClientURI)

直接使用MongoClientURI完成MongoDB的认证,它代表了一个URI对象。MongoClientURI的构造函数接受一个String类型的字符串,这个字符串的格式如下:

String sURI = String.format(
“mongodb://%s:%s@%s:%d/%s”, ”用户名“, ”密码“, ”localhost“, 27017, ”数据库");
MongoClientURI uri = new MongoClientURI(sURI);

MongoClient mongoClient = new MongoClient(uri);

DB db = mongoClient.getDB(“数据库");

MongoClientOptions.Builder mongoBuilder = new MongoClientOptions.Builder(); mongoBuilder.maxWaitTime(1000603);

mongoBuilder.connectTimeout(6010003); //与数据库建立连接的timeout设置为1分钟 mongoBuilder.minConnectionsPerHost(1);

MongoClientURI mongoClientURI = new MongoClientURI(“mongodb://root:root@localhost:27017/数据库",mongoBuilder);

SimpleMongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClientURI); MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory);

连接和认证——方式三( MongoTemplate)

public MongoClient mongoClient() {

MongoCredential credential = MongoCredential.createCredential(“用户”, "数据库", “password”);
return MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.applyConnectionString(new ConnectionString(serverList)))
.credential(credential)
.applicationName("应用")
.readConcern(ReadConcern.MAJORITY)
.readPreference(ReadPreference.primaryPreferred())
.writeConcern(WriteConcern.MAJORITY)
.applyToConnectionPoolSettings(builder -> {
builder
.maxWaitTime(1, TimeUnit.SECONDS)
.maxSize(10);
})
.applyToSocketSettings(builder -> builder
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS))
.build());
}

public MongoTemplate mongoTemplate() {
return new MongoTemplate(mongoClient(), "数据库");
}

CRUD——方式一

基于注解的方式:

1.实体上使用 @Document(collection = ”UserDO")
2.继承MongoRepository,简单的增删改查无需实现,可直接使用

@Repository
public interface UserExtRepository extends MongoRepository<UserDO, String> {
List<UserDO> findById(String id);
}

xxRepository.insert(UserDO);

xxRepository. findBy(”11”);

Repositry接口
基础的 Repository提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下:

Repository:仅仅是一个标识,表明任何继承它的均为仓库接口类

CrudRepository:继承Repository,实现了一组CRUD相关的方法

PagingAndSortingRepository:继承CrudRepository,实现了一组分页排序相关的方法

JpaRepository:继承PagingAndSortingRepository,实现一组JPA规范相关的方法

自定义的XxxxRepository需要继承 JpaRepository,这样的XxxxRepository接口就具备了通用的数据访问控制层的能力。

JpaSpecificationExecutor:不属于Repository体系,实现一组JPACriteria查询相关的方法

CRUD——方式二

增:

MongoCollection<Document> collection = mongo.getDb(“database”).getCollection(“CollectionName”);
Document document = Document.parse(JSONObject.toJSONString(userDO));
collection.insertOne(document);

collection.insertMany(document);

删:

MongoCollection<Document> collection = mongo.getDb(database).getCollection(“collection”);
BasicDBObject queryObject = new BasicDBObject(”id“,”1111“);
collection.deleteOne(queryObject);

collection.deleteMany(queryObject);

改:

MongoCollection<Document> collection = mongo.getDb(“database”).getCollection(“collection”);
BasicDBObject queryObject = new BasicDBObject(“id”,“1111”);
BasicDBObject updateNewOneSql = new BasicDBObject(“$set”, new BasicDBObject(“name”, “tom”));
collection.updateOne(queryObject, updateNewOneSql);

collection. updateMany();

collection. findOneAndUpdate();

查:

MongoCollection<Document> collection = mongo.getDb(database).getCollection(“collection”);
BasicDBObject queryObject = new BasicDBObject(”id“,”1111“);
FindIterable<Document> documents = collection.find(queryObject);

other:

collection.aggregate();//聚合索引

collection.countDocuments();//统计

collection.createIndex(); collection. dropIndex(); //增加删除索引

collection.createIndexs(); collection. dropIndexs(); //批量增加删除索引

collection.replaceOne();//替换文档

collection.distinct();//返回具有指定字段不同值的文档(去除指定字段的重复数据)

collection.bulkWrite();//批量写入

collection.dataSize();//返回集合大小

collection.drop(); //删除集合

聚合查询:

BasicDBObject query= new BasicDBObject();

BasicDBObject[] array = { new BasicDBObject("time", new BasicDBObject("gte", "2018-09-12")),new BasicDBObject("time", new BasicDBObject("lte","2018-12-25"))};

query.append("$and", array);

BasicDBObject match = new BasicDBObject("$match", query); // match(相当于 WHERE 或者 HAVING )

BasicDBObject group = new BasicDBObject("group", new BasicDBObject("_id", "subject") //group(相当于 GROUP BY)

.append("count", new BasicDBObject("$sum", 1)));

BasicDBObject sort = new BasicDBObject("$sort", new BasicDBObject("count", -1));//1:正序,-1倒序

BasicDBObject limit = new BasicDBObject("$limit", pageSize); //limt(只要前多少条数据,分页时使用)

BasicDBObject skip = new BasicDBObject("$skip", xx); //skip(跳过前面多少条数据,分页时使用)

List<DBObject> queryList = new ArrayList<>(); //queryList集合里的顺序不能乱,否则会报错。

queryList .add(match);

queryList .add(group);

queryList .add(sort);

queryList .add(skip);

queryList .add(limit);

AggregateIterable<Document> iterable = mongoClient.mongoClient.getDatabase(dbName).getCollection(gatherName).aggregate(queryList );

CRUD——分页查询

方式一:使用limit和skip进行分页find().skip((pageNum-1)*pageSize).sort().limit(pageSize)

方式二:通过原生的方法实现条件查询、分页和排序

方式三:通过实现Pageable接口等方式做自定义实现

find(索引).projection(查询字段).sort().limit()


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 前言 在sql转noSql途中总是免不了一些对于原有的复杂sql语句的转译工作,因为不熟悉java环境下对于mon...
    冘若烦阅读 6,455评论 0 3
  • 一、MongoDB简介 1.概述 ​ MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WE...
    郑元吉阅读 974评论 0 2
  • 本文包括以下几个方面: –安全措施 – 部署架构 – 系统优化 – 索引设计 – 备份监控 – 模式设计 – 程序...
    张伟科阅读 3,955评论 0 9
  • 最近要做一个统计用户行为的功能,需求不是很明确,数据结构也会不断变化。本着快速开发的想法,也不想频繁修改表结...
    神易风阅读 14,810评论 0 6
  • 1.连接到单个mongodb实例 (1)连接到端口上localhost上运行的MongoDB实例 MongoCli...
    smile_7a12阅读 1,629评论 0 1