SpringData Mongodb使用

MongoDb 關系型數(shù)據(jù)庫Mysql
數(shù)據(jù)庫(databases) 數(shù)據(jù)庫(databases)
集合(collections) 表(table)
文檔(document) 行(row)
下表是MongoDB與MySQL數(shù)據(jù)庫邏輯結(jié)構(gòu)概念的對比
window系統(tǒng)MongoDB安裝

雙擊“資源\微服務相關\配套軟件\mongodb”中的“mongodb-win32-x86_64-2008plus?ssl-3.2.10-signed.msi” 按照提示步驟安裝即可浇揩。安裝完成后比原,軟件會安裝在C:\Program
Files\MongoDB 目錄中焕蹄。
我們要啟動的服務程序就是C:\Program Files\MongoDB\Server\3.2\bin目錄下的
mongod.exe,為了方便我們每次啟動荒典,我將C:\Program
Files\MongoDB\Server\3.2\bin 設置到環(huán)境變量path中偎痛。

啟動
(1)首先打開命令提示符决左,創(chuàng)建一個用于存放數(shù)據(jù)的目錄
md d:\data
(2)啟動服務
mongod ‐‐dbpath=d:\data
我們在啟動信息中可以看到撒踪,mongoDB的默認端口是27017

在命令提示符輸入即可完成登錄 mongo
退出mongodb exit

Docker 環(huán)境下MongoDB安裝

docker run ‐di ‐‐name=tensquare_mongo ‐p 27017:27017 mongo
遠程登陸 命令提示符 mongo 192.168.184.134

常用命令
use spitdb  #選擇和創(chuàng)建數(shù)據(jù)庫
db.集合名稱.insert(數(shù)據(jù)) #以插入以下測試數(shù)據(jù)
db.spit.insert({content:"聽說十次方課程很給力呀",userid:"1011",nickname:"小
雅",visits:NumberInt(902)})
db.spit.find() #查詢素有數(shù)據(jù)
這里你會發(fā)現(xiàn)每條文檔會有一個叫_id的字段,這個相當于我們原來關系數(shù)據(jù)庫中表的主
鍵浦箱,當你在插入文檔記錄時沒有指定該字段吸耿,MongoDB會自動創(chuàng)建,其類型是ObjectID
類型酷窥。如果我們在插入文檔記錄時指定該字段也可以咽安,其類型可以是ObjectID類型,也
可以是MongoDB支持的任意類型蓬推。
輸入以下測試語句:
db.spit.insert({_id:"1",content:"我還是沒有想明白到底為啥出
錯",userid:"1012",nickname:"小明",visits:NumberInt(2020)});
db.spit.insert({_id:"2",content:"加班到半夜",userid:"1013",nickname:"凱
撒",visits:NumberInt(1023)});
db.spit.insert({_id:"3",content:"手機流量超了咋
辦妆棒?",userid:"1013",nickname:"凱撒",visits:NumberInt(111)});
db.spit.insert({_id:"4",content:"堅持就是勝利",userid:"1014",nickname:"諾
諾",visits:NumberInt(1223)});

如果我想按一定條件來查詢,比如我想查詢userid為1013的記錄拳氢,怎么辦募逞?很簡單!只
要在find()中添加參數(shù)即可馋评,參數(shù)也是json格式,如下:

db.spit.find({userid:'1013'})

如果你只需要返回符合條件的第一條數(shù)據(jù)刺啦,我們可以使用findOne命令來實現(xiàn)

db.spit.findOne({userid:'1013'})

如果你想返回指定條數(shù)的記錄留特,可以在find方法后調(diào)用limit來返回結(jié)果,例如:

db.spit.find().limit(3)
修改與刪除文檔
db.集合名稱.update(條件,修改后的數(shù)據(jù))
db.spit.update({_id:"1"},{visits:NumberInt(1000)})
執(zhí)行后,我們會發(fā)現(xiàn)蜕青,這條文檔除了visits字段其它字段都不見了苟蹈,為了解決這個問題,
我們需要使用修改器$set來實現(xiàn)右核,命令如下
db.spit.update({_id:"2"},{$set:{visits:NumberInt(2000)}})
刪除文檔的語法結(jié)構(gòu):
db.集合名稱.remove(條件)
以下語句可以將數(shù)據(jù)全部刪除慧脱,請慎用
db.spit.remove({})
如果刪除visits=1000的記錄,輸入以下語句
db.spit.remove({visits:1000})
統(tǒng)計記錄條件使用count()方法贺喝。以下語句統(tǒng)計spit集合的記錄數(shù)
db.spit.count()
如果按條件統(tǒng)計 菱鸥,例如:統(tǒng)計userid為1013的記錄條數(shù)
db.spit.count({userid:"1013"})
模糊查詢
db.spit.find({content:/流量/})
如果要查詢吐槽內(nèi)容中以“加班”開頭的,代碼如下:
db.spit.find({content:/^加班/})
大于 小于 不等于

<, <=, >, >= 這個操作符也是很常用的躏鱼,格式如下:

db.集合名稱.find({ "field" : { $gt: value }}) // 大于: field > value
db.集合名稱.find({ "field" : { $lt: value }}) // 小于: field < value
db.集合名稱.find({ "field" : { $gte: value }}) // 大于等于: field >= value
db.集合名稱.find({ "field" : { $lte: value }}) // 小于等于: field <= value
db.集合名稱.find({ "field" : { $ne: value }}) // 不等于: field != value
示例:查詢吐槽瀏覽量大于1000的記錄
db.spit.find({visits:{$gt:1000}})
包含與不包含

包含使用$in操作符氮采。
示例:查詢吐槽集合中userid字段包含1013和1014的文檔

db.spit.find({userid:{$in:["1013","1014"]}})

不包含使用$nin操作符。
示例:查詢吐槽集合中userid字段不包含1013和1014的文檔

db.spit.find({userid:{$nin:["1013","1014"]}})
條件連接

示例:查詢吐槽集合中visits大于等于1000 并且小于2000的文檔

db.spit.find({$and:[ {visits:{$gte:1000}} ,{visits:{$lt:2000} }]})

如果兩個以上條件之間是或者的關系染苛,我們使用 操作符進行關聯(lián)鹊漠,與前面and的使用
方式相同
示例:查詢吐槽集合中userid為1013,或者瀏覽量小于2000的文檔記錄

db.spit.find({$or:[ {userid:"1013"} ,{visits:{$lt:2000} }]})
列值增長

如果我們想實現(xiàn)對某列值在原有值的基礎上進行增加或減少茶行,可以使用$inc運算符來實現(xiàn)

db.spit.update({_id:"2"},{$inc:{visits:NumberInt(1)}} )
Java操作MongoDB
創(chuàng)建工程 mongoDemo, 引入依賴
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb‐driver</artifactId>
<version>3.6.3</version>
</dependency>
</dependencies>

創(chuàng)建測試類

/**
* MongoDb入門小demo
*/
public class MongoDemo {
public static void main(String[] args) {
MongoClient client=new MongoClient("192.168.184.134");//創(chuàng)建連接
MongoDatabase spitdb = client.getDatabase("spitdb");//打開數(shù)據(jù)庫
MongoCollection<Document> spit = spitdb.getCollection("spit");//
獲取集合
FindIterable<Document> documents = spit.find();//查詢記錄獲取文檔集
合
for(Document document:documents){ //
System.out.println("內(nèi)容:"+ document.getString("content"));
System.out.println("用戶ID:"+document.getString("userid"));
System.out.println("瀏覽量:"+document.getInteger("visits"));
}
client.close();//關閉連接
}
}
條件查詢

BasicDBObject對象:表示一個具體的記錄躯概,BasicDBObject實現(xiàn)了DBObject,是key?value的數(shù)據(jù)結(jié)構(gòu)畔师,用起來和HashMap是基本一致的娶靡。

查詢userid為1013的記錄
獲取集合
BasicDBObject bson=new BasicDBObject("userid","1013");// 構(gòu)建查詢
條件
FindIterable<Document> documents = spit.find(bson);//查詢記錄獲取結(jié)
果集合
for(Document document:documents){ //
System.out.println("內(nèi)容:"+ document.getString("content"));
System.out.println("用戶ID:"+document.getString("userid"));
System.out.println("瀏覽量:"+document.getInteger("visits"));
}
client.close();//關閉連接
}
查詢?yōu)g覽量大于1000的記錄
獲取集合
BasicDBObject bson=new BasicDBObject("visits",new
BasicDBObject("$gt",1000) );// 構(gòu)建查詢條件
FindIterable<Document> documents = spit.find(bson);//查詢記錄獲取結(jié)
果集合
for(Document document:documents){ //
System.out.println("內(nèi)容:"+ document.getString("content"));
System.out.println("用戶ID:"+document.getString("userid"));
System.out.println("瀏覽量:"+document.getInteger("visits"));
}
client.close();//關閉連接
}
插入數(shù)據(jù)
獲取集合
Map<String,Object> map=new HashMap();
map.put("content","我要吐槽");
map.put("userid","9999");
map.put("visits",123);
map.put("publishtime",new Date());
Document document=new Document(map);
spit.insertOne(document);//插入數(shù)據(jù)
client.close();
}
SpringDataMongoDB

####### pom.xml引入依賴

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐data‐mongodb</artifactId>
</dependency>
<dependency>
<groupId>com.tensquare</groupId>
<artifactId>tensquare_common</artifactId>
<version>1.0‐SNAPSHOT</version>
</dependency>
創(chuàng)建application.yml
server:
port: 9006
spring:
application:
name: tensquare‐spit #指定服務名
data:
mongodb:
host: 192.168.184.134
database: spitdb
創(chuàng)建啟動類
創(chuàng)建實體類
/**
* 吐槽
* @author Administrator
*
*/
public class Spit implements Serializable{
@Id
private String _id;  //mongodb默認主鍵帶_
private String content;
private Date publishtime;
private String userid;
private String nickname;
private Integer visits;
private Integer thumbup;
private Integer share;
private Integer comment;
private String state;
private String parentid;
// getter and setter .....
}
dao
  /**
* 吐槽數(shù)據(jù)訪問層
* @author Administrator
*
*/
public interface SpitDao extends MongoRepository<Spit, String>{
}
創(chuàng)建業(yè)務邏輯類
@Service
public class SpitService {
@Autowired
private SpitDao spitDao;
@Autowired
private IdWorker idWorker;
/**
* 查詢?nèi)坑涗?* @return
*/
public List<Spit> findAll(){
return spitDao.findAll();
}
/**
* 根據(jù)主鍵查詢實體
* @param id
* @return
*/
public Spit findById(String id){
Spit spit = spitDao.findById(id).get();
return spit;
}
/**
* 增加
* @param spit
*/
public void add(Spit spit) {
spit.set_id(idWorker.nextId()+""); //主鍵值
spitDao.save(spit);
}
/**
* 修改
* @param spit
*/
public void update(Spit spit) {
北京市昌平區(qū)建材城西路金燕龍辦公樓一層 電話:400-618-9090
(4)com.tensquare.spit包下創(chuàng)建controller類
public void update(Spit spit) {
spitDao.save(spit);
}
/**
* 刪除
* @param id
*/
public void deleteById(String id) {
spitDao.deleteById(id);
}
}
創(chuàng)建controller類
@RestController
@CrossOrigin
@RequestMapping("/spit")
public class SpitController {
@Autowired
private SpitService spitService;
/**
* 查詢?nèi)繑?shù)據(jù)
* @return
*/
@RequestMapping(method= RequestMethod.GET)
public Result findAll(){
return new Result(true, StatusCode.OK,"查詢成
功",spitService.findAll());
}
/**
* 根據(jù)ID查詢
* @param id ID
* @return
*/
@RequestMapping(value="/{id}",method=RequestMethod.GET)
public Result findOne(@PathVariable String id){
return new Result(true,StatusCode.OK,"查詢成
功",spitService.findById(id));
}
/**
* 增加
* @param spit
*/
@RequestMapping(method=RequestMethod.POST)
public Result add(@RequestBody Spit spit ){
spitService.add(spit);
return new Result(true,StatusCode.OK,"增加成功");
}
/**
北京市昌平區(qū)建材城西路金燕龍辦公樓一層 電話:400-618-9090
4.2.3 根據(jù)上級ID查詢吐槽列表
(1)SpitDao新增方法定義
(2)SpitService新增方法
* 修改
* @param spit
*/
@RequestMapping(value="/{id}",method=RequestMethod.PUT)
public Result update(@RequestBody Spit spit,@PathVariable String id )
{
spit.set_id(id);
spitService.update(spit);
return new Result(true,StatusCode.OK,"修改成功");
}
/**
* 刪除
* @param id
*/
@RequestMapping(value="/{id}",method=RequestMethod.DELETE)
public Result deleteById(@PathVariable String id ){
spitService.deleteById(id);
return new Result(true,StatusCode.OK,"刪除成功");
}
}
根據(jù)上級ID查詢吐槽列表

dao

/**
* 根據(jù)上級ID查詢吐槽列表(分頁)
* @param parentid
* @param pageable
* @return
*/
public Page<Spit> findByParentid(String parentid,Pageable pageable);
SpitService新增方法
/**
* 根據(jù)上級ID查詢吐槽列表
* @param parentid
* @param page
* @param size
* @return
*/
public Page<Spit> findByParentid(String parentid,int page, int size){
PageRequest pageRequest = PageRequest.of(page‐1, size);
return spitDao.findByParentid(parentid, pageRequest);
}
SpitController新增方法
/**
* 根據(jù)上級ID查詢吐槽分頁數(shù)據(jù)
* @param page
* @param size
* @return
*/
@RequestMapping(value="/comment/{parentId}/{page}/{size}",method=RequestM
ethod.GET)
public Result findByParentid(@PathVariable String parentId,
@PathVariable int page,@PathVariable int size){
Page<Spit> pageList = spitService.findByParentid(parentId,page,
size);
return new Result(true,StatusCode.OK,"查詢成功",new
PageResult<Spit>(pageList.getTotalElements(), pageList.getContent() ) );
}
吐槽點贊

我們看一下以下點贊的代碼: SpitService 新增updateThumbup方法

/**
* 點贊
* @param id
*/
public void updateThumbup(String id){
Spit spit = spitDao.findById(id).get();
spit.setThumbup(spit.getThumbup()+1);
spitDao.save(spit);
}

以上方法雖然實現(xiàn)起來比較簡單,但是執(zhí)行效率并不高茉唉,因為我只需要將點贊數(shù)加1就可
以了固蛾,沒必要查詢出所有字段修改后再更新所有字段。
我們可以使用MongoTemplate類來實現(xiàn)對某列的操作度陆。

修改SpitService
@Autowired
private MongoTemplate mongoTemplate;
/**
* 點贊
* @param id
*/
public void updateThumbup(String id){
Query query=new Query();
query.addCriteria(Criteria.where("_id").is(id));
Update update=new Update();
update.inc("thumbup",1);
mongoTemplate.updateFirst(query,update,"spit");
}
SpitController新增方法
/**
* 點贊
* @param id
* @return
*/
@RequestMapping(value="/thumbup/{id}",method=RequestMethod.PUT)
public Result updateThumbup(@PathVariable String id){
spitService.updateThumbup(id);
return new Result(true,StatusCode.OK,"點贊成功");
}

通過redis控制不能重復點贊

首先引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐data‐redis</artifactId>
</dependency>
修改application.yml
redis:
host: 192.168.184.135
修改SpitController代碼邏輯
@Autowired
private RedisTemplate redisTemplate;
/**
* 吐槽點贊
* @param id
* @return
*/
@RequestMapping(value = "/thumbup/{id}", method = RequestMethod.PUT)
public Result updateThumbup(@PathVariable String id){
//判斷用戶是否點過贊
String userid="2023";// 后邊我們會修改為當前登陸的用戶
if(redisTemplate.opsForValue().get("thumbup_"+userid+"_"+
id)!=null){
return new Result(false,StatusCode.REPERROR,"你已經(jīng)點過贊了");
}
spitService.updateThumbup(id);
redisTemplate.opsForValue().set( "thumbup_"+userid+"_"+ id,"1");
return new Result(true,StatusCode.OK,"點贊成功");
}
修改SpitService的add方法
/**
* 發(fā)布吐槽(或吐槽評論)
* @param spit
*/
public void add(Spit spit){
spit.set_id( idWorker.nextId()+"" );
spit.setPublishtime(new Date());//發(fā)布日期
spit.setVisits(0);//瀏覽量
spit.setShare(0);//分享數(shù)
spit.setThumbup(0);//點贊數(shù)
spit.setComment(0);//回復數(shù)
spit.setState("1");//狀態(tài)
if(spit.getParentid()!=null && !"".equals(spit.getParentid())){//
如果存在上級ID,評論
Query query=new Query();
query.addCriteria(Criteria.where("_id").is(spit.getParentid()));
Update update=new Update();
update.inc("comment",1);
mongoTemplate.updateFirst(query,update,"spit");
}
spitDao.save(spit);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艾凯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子懂傀,更是在濱河造成了極大的恐慌趾诗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹬蚁,死亡現(xiàn)場離奇詭異恃泪,居然都是意外死亡,警方通過查閱死者的電腦和手機犀斋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門贝乎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叽粹,你說我怎么就攤上這事览效∪匆ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵锤灿,是天一觀的道長挽拔。 經(jīng)常有香客問我,道長但校,這世上最難降的妖魔是什么螃诅? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮状囱,結(jié)果婚禮上术裸,老公的妹妹穿的比我還像新娘。我一直安慰自己浪箭,他們只是感情好穗椅,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奶栖,像睡著了一般匹表。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宣鄙,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天袍镀,我揣著相機與錄音,去河邊找鬼冻晤。 笑死苇羡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鼻弧。 我是一名探鬼主播设江,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼攘轩!你這毒婦竟也來了叉存?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤度帮,失蹤者是張志新(化名)和其女友劉穎歼捏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笨篷,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡瞳秽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了率翅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片练俐。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冕臭,靈堂內(nèi)的尸體忽然破棺而出痰洒,到底是詐尸還是另有隱情瓢棒,我是刑警寧澤浴韭,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布丘喻,位于F島的核電站,受9級特大地震影響念颈,放射性物質(zhì)發(fā)生泄漏泉粉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一榴芳、第九天 我趴在偏房一處隱蔽的房頂上張望嗡靡。 院中可真熱鬧,春花似錦窟感、人聲如沸讨彼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哈误。三九已至,卻和暖如春躏嚎,著一層夾襖步出監(jiān)牢的瞬間蜜自,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工卢佣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留重荠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓虚茶,卻偏偏與公主長得像戈鲁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嘹叫,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

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