传统的mongoDB(不属于SpringData系列)
MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热 门 的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最 像关 系数据库的产品。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以 存 储比较复杂的数据类型。
1.基本数据类型 Bson
null: 用于表示控制或者不存在的字段,{“x”:null}
布尔值: 布尔类型有两个值true和false,{“x”:true}
数值:shell默认使用64位浮点型数值。{“x”:3.14} 或{“x”:3} 。对于整形值,可以使用NumberInt(4字节符号整数) 或NumberLong(8字节符号整数),{“x”:NumberInt("3")}
字符串: UTF-8字符串都可以表示为字符串类型的数据,{“x”: "呵呵"}
日期: 日期被存储为自新纪元以来经过的毫秒数,不存储时区,{“x”:new Date()}
正则表达式: 查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相同,{“x”: /[abc]/}
数组: 数据列表或数据集可以表示为数组,{“x”: ["a","b"]}
内嵌文档: 文档可以嵌套其他文档,被嵌套的文档作为值来处理,{“x”: {"y": 3}}
对象id: 对象id是一个12字节的字符串,是文档的唯一标识,{“x”: objectId()}
二进制数据: 二进制数据是一个任意字节的字符串,它不能直接在shell中使用,如果要将非utf-字符保存到数据中,二进制数据是唯一的方式
代码: 查询和文档中可以包含任何JavaScript代码,{“x”: function(){/..../}}
2.连接: 服务器(mongod.exe)和客户端(mongo.exe)
客户端默认端口27017
安装: mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi
安装
双击 mongodb-win32-x86_64-2008plusssl-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 设置到环境变量path中。
启动
(1)首先打开命令提示符,创建一个用于存放数据的目录
md d:\data
(2)启动服务
mongod ‐‐dbpath=d:\data
我们在启动信息中可以看到,mongoDB的默认端口是27017
如果我们想改变默认的启动端口,可以通过--port来指定端口
在命令提示符输入以下命令即可完成登陆
mongo
退出mongodb
exit
服务端 > 指定文件存储的路径: H:\software\MongoDB> mongod -dbpath=h:\software\MongoDB\data
客户端的开启:
连接本机的mongoDB : C:\Users\lisongfeng> mongo 默认连接localhost
连接服务器上的mongoDB: mongo 192.168.1.105
3. 创建数据库和表
a.创建数据库,有的话直接使用,没有的话创建
> use spitdb
switched to db spitdb
b.创建表单和插入表单
> db.spit.find()
> db.spit.insert({content:"今天天气真的很好",visit:"10"})
WriteResult({ "nInserted" : 1 })
c.再次查看:如果不指定插入的_id,则产生objectId("....")
> db.spit.find()
{ "_id" : ObjectId("5c47376c7f48bac2e3f29bd9"), "content" : "今天天气真的很好", "visit" : "10" }
d.db.spit.findOne({userid:"1013"}) 根据id进行查询
e.db.spit.find().limit(3); 查询前三条
f.更新操作
db.spit.update({"_id" : "1"},{visits: 2000}); -- 这种设置会将其他的值置为空
正确的设置
db.spit.update({"_id" : "1"},{$set : {visits : NumberInt(2000)}})
g.删除操作
db.spit.remove({"_id":"1"}); -- 根据id进行删除
db.spit.remove({}); -- 删除全部
h.查询数量
db.spit.count(); -- 查询全部
db.spit.count({"userId":"1013"}) -- 查询用户id为1013的数据
i.模糊查询
db.spit.find({content : /流量/}) 内容包含流量的
db.spit.find({content : /^流量/}) 以流量开头的内容
j. 大于、小于、包含
db.spit.find({visits : {$gt : 1500}}) 大于
db.spit.find({userid : {$in : ["1013","1014"]}}) 包含
db.spit.find({$or : [{userId : "1013"},{visits : {$lt : 2000}}]})
k.列值增长
db.spit.update({_id : "2"},{$inc : {visits: NumberInt(1)}})
4.代码实现mongoDB相关 -- 简单查询
mongodb-driver是mongo官方推出的java连接mongoDB的驱动包,相当于JDBC驱动。
<dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb‐driver</artifactId> <version>3.6.3</version> </dependency> </dependencies>
public static void main(String[] args) {
// 连接mongo服务器
MongoClient mongoClient = new MongoClient("192.168.1.105");
// 得到要操作的数据库
MongoDatabase spitdb = mongoClient.getDatabase("spitdb");
// 得到要操作的集合
MongoCollection<Document> spit = spitdb.getCollection("spit");
// 得到集合中所有的文档
FindIterable<Document> documents = spit.find();
// 遍历数据
for (Document document : documents) {
System.out.println("内容:" + document.getString("content"));
// System.out.println("用户id:" + document.getString("userid"));
System.out.println("访问量:" + document.getString("visit"));
}
mongoClient.close();
}
条件查询
// 连接mongo服务器
MongoClient mongoClient = new MongoClient("192.168.1.105");
// 得到要操作的数据库
MongoDatabase spitdb = mongoClient.getDatabase("spitdb");
// 得到要操作的集合
MongoCollection<Document> spit = spitdb.getCollection("spit");
// 得到集合中所有的文档
// 封装条件只查询用户id为1013的
// BasicDBObject bson = new BasicDBObject("userid","1013");
// 查询点赞大于10的,find({visits : {$gt:10}})
BasicDBObject bson = new BasicDBObject("visit",new BasicDBObject("$gt" ,10));
FindIterable<Document> documents = spit.find(bson);
// 遍历数据
for (Document document : documents) {
System.out.println("内容:" + document.getString("content"));
// System.out.println("用户id:" + document.getString("userid"));
System.out.println("访问量:" + document.getInteger("visit"));
}
mongoClient.close();
相关依赖和代码请参照:
git@gitee.com:SmileLsf/mongoDB_demo.git
SpringDataMongoDB 开启敏捷开发
官网主页: https://projects.spring.io/spring-data-mongodb/
1.
server: port: 9006 spring: application: name: tensquare-spit #指定服务名 data: mongodb: host: 192.168.1.105 database: spitdb #数据库名称
2.新建吐槽实体类需要注意,id需要添加下划线
@Id private String _id;
3.dao层
public interface SpitDao extends MongoRepository<Spit,String> { }
4.service层类似于jpa的写法
5.突出的一个功能:吐槽点赞、控制点赞不能重复
使用RedisTemplate控制点赞的次数不能重复
/**
* 吐槽点赞,控制只能点赞一次
*/
@RequestMapping(value="/thumbup/{spitId}",method = RequestMethod.PUT)
public Result thumbup(@PathVariable String spitId){
// 暂时做固定处理
String userId = "123";
if (redisTemplate.opsForValue().get("thumbup_"+userId+"_"+ spitId) != null) {
return new Result(false,StatusCode.ERROR,"不能重复点赞");
}
spitService.thumbup(spitId);
redisTemplate.opsForValue().set("thumbup_"+userId+"_"+ spitId,1);
return new Result(true,StatusCode.OK,"点赞成功");
}
使用mongoTemplate的原生的方法进行的点赞的累加,当然可以使用先查询后更新的方法
/**
* 点赞
* @param spitId
*/
public void thumbup(String spitId){
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(spitId));
Update update = new Update();
update.inc("thumbup",1);
mongoTemplate.updateFirst(query,update,"spit");
}
第二个突出的功能:新增时,给父节点的评论数新增1
public void save(Spit spit){
spit.set_id(idWorker.nextId() + "");
spit.setComment(0);
spit.setPublishtime(new Date());
spit.setShare(0);
spit.setThumbup(0);
spit.setVisits(0);
if (spit.getParentid() != null && !"".equals(spit.getParentid())) {
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);
}