MongoDB

最近進(jìn)行MongoDB開發(fā)叮阅,雖然需求比較簡(jiǎn)單,但是涉及較多的細(xì)節(jié)使用泣特。加之不夠熟悉 就使用了各種方法達(dá)到目標(biāo)浩姥。

1.簡(jiǎn)介

MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù),一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品状您,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富及刻,最像關(guān)系數(shù)據(jù)庫(kù)的。

MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔竞阐,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成缴饭。MongoDB 文檔類似于 JSON 對(duì)象。字段值可以包含其他文檔骆莹,數(shù)組及文檔數(shù)組颗搂。支持比較豐富和復(fù)雜的數(shù)據(jù)類型。

MongoDB已經(jīng)在多個(gè)站點(diǎn)部署幕垦,其主要場(chǎng)景如下:

1)網(wǎng)站實(shí)時(shí)數(shù)據(jù)處理丢氢。它非常適合實(shí)時(shí)的插入傅联、更新與查詢,并具備網(wǎng)站實(shí)時(shí)數(shù)據(jù)存儲(chǔ)所需的復(fù)制及高度伸縮性疚察。

2)緩存蒸走。由于性能很高,它適合作為信息基礎(chǔ)設(shè)施的緩存層貌嫡。在系統(tǒng)重啟之后比驻,由它搭建的持久化緩存層可以避免下層的數(shù)據(jù)源過(guò)載。

3)高伸縮性的場(chǎng)景岛抄。非常適合由數(shù)十或數(shù)百臺(tái)服務(wù)器組成的數(shù)據(jù)庫(kù)别惦,它的路線圖中已經(jīng)包含對(duì)MapReduce引擎的內(nèi)置支持。

不適用的場(chǎng)景如下:

1)要求高度事務(wù)性的系統(tǒng)夫椭。

2)傳統(tǒng)的商業(yè)智能應(yīng)用掸掸。

3)復(fù)雜的跨文檔(表)級(jí)聯(lián)查詢。

2.使用

連接和認(rèn)證——方式一( MongoClient )

使用mongoclient的方式蹭秋。MongoClient是線程安全的扰付,可以在多程程環(huán)境中共享同一個(gè)MongoClient。通常來(lái)說(shuō)仁讨,一個(gè)應(yīng)用程序中悯周,只需要生成一個(gè)全局的MongoClient實(shí)例,然后在程序的其他地方使用這個(gè)實(shí)例即可陪竿。

直接連接:

MongoClient mongoClient = new MongoClient("localhost", 27017); // 獲取鏈接
MongoDatabase database = mongoClient.getDatabase("mydb"); // 獲取數(shù)據(jù)庫(kù)

認(rèn)證與連接:

MongoClientOptions.Builder builder = MongoClientOptions.builder(); //可以通過(guò)builder做各種詳細(xì)配置 MongoClientOptions myOptions = builder.build();

ArrayList<ServerAddress> serverAddressList = new ArrayList();

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

serverAddressList.add(record); //用戶名屠橄、默認(rèn)庫(kù)名族跛、密碼

MongoCredential credential = MongoCredential.createCredential("賬號(hào)", "默認(rèn)庫(kù)名", "密碼".toCharArray());

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

連接和認(rèn)證——方式二( MongoClientURI)

直接使用MongoClientURI完成MongoDB的認(rèn)證,它代表了一個(gè)URI對(duì)象锐墙。MongoClientURI的構(gòu)造函數(shù)接受一個(gè)String類型的字符串礁哄,這個(gè)字符串的格式如下:

String sURI = String.format(
“mongodb://%s:%s@%s:%d/%s”, ”用戶名“, ”密碼“, ”localhost“, 27017, ”數(shù)據(jù)庫(kù)");
MongoClientURI uri = new MongoClientURI(sURI);

MongoClient mongoClient = new MongoClient(uri);

DB db = mongoClient.getDB(“數(shù)據(jù)庫(kù)");

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

mongoBuilder.connectTimeout(6010003); //與數(shù)據(jù)庫(kù)建立連接的timeout設(shè)置為1分鐘 mongoBuilder.minConnectionsPerHost(1);

MongoClientURI mongoClientURI = new MongoClientURI(“mongodb://root:root@localhost:27017/數(shù)據(jù)庫(kù)",mongoBuilder);

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

連接和認(rèn)證——方式三( MongoTemplate)

public MongoClient mongoClient() {

MongoCredential credential = MongoCredential.createCredential(“用戶”, "數(shù)據(jù)庫(kù)", “password”);
return MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.applyConnectionString(new ConnectionString(serverList)))
.credential(credential)
.applicationName("應(yīng)用")
.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(), "數(shù)據(jù)庫(kù)");
}

CRUD——方式一

基于注解的方式:

1.實(shí)體上使用 @Document(collection = ”UserDO")
2.繼承MongoRepository,簡(jiǎn)單的增刪改查無(wú)需實(shí)現(xiàn)溪北,可直接使用

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

xxRepository.insert(UserDO);

xxRepository. findBy(”11”);

Repositry接口
基礎(chǔ)的 Repository提供了最基本的數(shù)據(jù)訪問(wèn)功能桐绒,其幾個(gè)子接口則擴(kuò)展了一些功能。它們的繼承關(guān)系如下:

Repository:僅僅是一個(gè)標(biāo)識(shí)之拨,表明任何繼承它的均為倉(cāng)庫(kù)接口類

CrudRepository:繼承Repository茉继,實(shí)現(xiàn)了一組CRUD相關(guān)的方法

PagingAndSortingRepository:繼承CrudRepository,實(shí)現(xiàn)了一組分頁(yè)排序相關(guān)的方法

JpaRepository:繼承PagingAndSortingRepository蚀乔,實(shí)現(xiàn)一組JPA規(guī)范相關(guān)的方法

自定義的XxxxRepository需要繼承 JpaRepository烁竭,這樣的XxxxRepository接口就具備了通用的數(shù)據(jù)訪問(wèn)控制層的能力。

JpaSpecificationExecutor:不屬于Repository體系吉挣,實(shí)現(xiàn)一組JPACriteria查詢相關(guān)的方法

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();//統(tǒng)計(jì)

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

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

collection.replaceOne();//替換文檔

collection.distinct();//返回具有指定字段不同值的文檔(去除指定字段的重復(fù)數(shù)據(jù))

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(相當(dāng)于 WHERE 或者 HAVING )

BasicDBObject group = new BasicDBObject("group", new BasicDBObject("_id", "subject") //group(相當(dāng)于 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(只要前多少條數(shù)據(jù)婉弹,分頁(yè)時(shí)使用)

BasicDBObject skip = new BasicDBObject("$skip", xx); //skip(跳過(guò)前面多少條數(shù)據(jù),分頁(yè)時(shí)使用)

List<DBObject> queryList = new ArrayList<>(); //queryList集合里的順序不能亂终吼,否則會(huì)報(bào)錯(cuò)镀赌。

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——分頁(yè)查詢

方式一:使用limit和skip進(jìn)行分頁(yè)find().skip((pageNum-1)*pageSize).sort().limit(pageSize)

方式二:通過(guò)原生的方法實(shí)現(xiàn)條件查詢、分頁(yè)和排序

方式三:通過(guò)實(shí)現(xiàn)Pageable接口等方式做自定義實(shí)現(xiàn)

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


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鼻百,隨后出現(xiàn)的幾起案子润梯,更是在濱河造成了極大的恐慌,老刑警劉巖威彰,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異穴肘,居然都是意外死亡歇盼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門评抚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)豹缀,“玉大人,你說(shuō)我怎么就攤上這事慨代⌒象希” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵侍匙,是天一觀的道長(zhǎng)氮惯。 經(jīng)常有香客問(wèn)我,道長(zhǎng)想暗,這世上最難降的妖魔是什么妇汗? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮说莫,結(jié)果婚禮上杨箭,老公的妹妹穿的比我還像新娘。我一直安慰自己储狭,他們只是感情好互婿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辽狈,像睡著了一般慈参。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刮萌,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天懂牧,我揣著相機(jī)與錄音,去河邊找鬼。 笑死僧凤,一個(gè)胖子當(dāng)著我的面吹牛畜侦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播躯保,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼旋膳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了途事?” 一聲冷哼從身側(cè)響起验懊,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尸变,沒(méi)想到半個(gè)月后义图,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡召烂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年碱工,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奏夫。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怕篷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酗昼,到底是詐尸還是另有隱情廊谓,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布麻削,位于F島的核電站蒸痹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏呛哟。R本人自食惡果不足惜叠荠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竖共。 院中可真熱鬧,春花似錦俺祠、人聲如沸公给。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淌铐。三九已至,卻和暖如春蔫缸,著一層夾襖步出監(jiān)牢的瞬間腿准,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吐葱,地道東北人街望。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像弟跑,于是被迫代替她去往敵國(guó)和親灾前。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言 在sql轉(zhuǎn)noSql途中總是免不了一些對(duì)于原有的復(fù)雜sql語(yǔ)句的轉(zhuǎn)譯工作孟辑,因?yàn)椴皇煜ava環(huán)境下對(duì)于mon...
    冘若煩閱讀 6,486評(píng)論 0 3
  • 一哎甲、MongoDB簡(jiǎn)介 1.概述 ? MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù),由C++語(yǔ)言編寫饲嗽。旨在為WE...
    鄭元吉閱讀 977評(píng)論 0 2
  • 本文包括以下幾個(gè)方面: –安全措施 – 部署架構(gòu) – 系統(tǒng)優(yōu)化 – 索引設(shè)計(jì) – 備份監(jiān)控 – 模式設(shè)計(jì) – 程序...
    張偉科閱讀 3,977評(píng)論 0 9
  • 最近要做一個(gè)統(tǒng)計(jì)用戶行為的功能炭玫,需求不是很明確,數(shù)據(jù)結(jié)構(gòu)也會(huì)不斷變化貌虾。本著快速開發(fā)的想法吞加,也不想頻繁修改表結(jié)...
    神易風(fēng)閱讀 14,820評(píng)論 0 6
  • 1.連接到單個(gè)mongodb實(shí)例 (1)連接到端口上localhost上運(yùn)行的MongoDB實(shí)例 MongoCli...
    smile_7a12閱讀 1,669評(píng)論 0 1