MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最像关系型数据库(MySQL)的非关系型数据库。
它支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活。
<!--springboot是2.1.6.RELEASE-->
<!--操作MongoDB核心包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!--简化实体类和日志的操作-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
spring:
data:
mongodb:
host: 192.168.142.139
database: articledb#数据库名
port: 27017
#也可以使用uri连接
#uri: mongodb://192.168.142.139:27017/articledb
@Data//相当于get/set方法
@Document(collection="comment")//对应数据库的集合名(表名)
//复合索引
//@CompoundIndex( def = "{'userid': 1, 'nickname': -1}")
public class Comment implements Serializable {
//主键标识,该属性的值会自动对应mongodb的主键字段"_id",如果该属性名就叫“id”,则该注解可以省略,否则必须写
@Id
private String id;//主键
//该属性对应mongodb的字段的名字,如果一致,则无需该注解
@Field("content")
private String content;//吐槽内容
private Date publishtime;//发布日期
//添加了一个单字段的索引一般在数据库中加
@Indexed
private String userid;//发布人ID
private String nickname;//昵称
private LocalDateTime createdatetime;//评论的日期时间
private Integer likenum;//点赞数
private Integer replynum;//回复数
private String state;//状态
private String parentid;//上级ID
private String articleid;
private List<User> users;//自己建立的一个实体类User测试内嵌数据
}
@Autowired
private MongoTemplate mongoTemplate;
@Override
public Comment insert(Comment comment) {
log.info("简单的新增开始");
Comment insert = mongoTemplate.insert(comment);
return insert;
}
添加多条记录
mongoTemplate.insert(数据结合,Comment.class);
根据实体类对象删除测试只有设定id才可以
@Override
public Long removeObj() {
log.info("removeObj()");
Comment comment = new Comment();
comment.setId("1");
DeleteResult remove = mongoTemplate.remove(comment);
long deletedCount = remove.getDeletedCount();
return deletedCount;
}
根据条件删除(Query对象)推荐使用这个
@Override
public Long removeQuery() {
log.info("removeQuery");
Query query = new Query();
//把userid==100的删除
Criteria criteria = Criteria.where("userid").is("100");
query.addCriteria(criteria);
DeleteResult remove = mongoTemplate.remove(query, Comment.class);
return remove.getDeletedCount();
}
mongoTemplate.updateFirst(query, update, Comment.class);更新匹配的第一条数据
@Override
public Long updateFirstComment() {
log.info("updateFirstComment");
Query query = Query.query(Criteria.where("userid").is("1003"));
Update update = new Update();
update.set("nickname", "updateFirstComment");
UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Comment.class);
System.out.println(updateResult.getMatchedCount());
return updateResult.getMatchedCount();
}
UpdateResult updateMulti(Query query, Update update, Class<?> entityClass);更新匹配条件的全部数据
@Override
public Long updateMultiComment() {
log.info("updateMultiComment");
Query query = Query.query(Criteria.where("userid").is("1003"));
Update update = new Update();
update.set("nickname", "updateMultiComment");
UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Comment.class);
System.out.println(updateResult.getMatchedCount());
return updateResult.getMatchedCount();
}
UpdateResult upsert(Query var1, Update var2, Class<?> var3);如果数据不存在就增加一条
@Override
public List<Comment> findAll() {
//Comment.class实体类的class对象
log.info("findAll");
List<Comment> all = mongoTemplate.findAll(Comment.class);
return all;
}
@Override
public List<Comment> findQueryComment() {
//条件一
Criteria criteria1 = new Criteria();
criteria1.and("users.id").is("001");
//条件二
Criteria criteria2 = new Criteria();
criteria2.and("userid").is("1003");
//把条件或起来
Criteria criteria = new Criteria();
criteria.orOperator(criteria1,criteria2);
Query query = new Query();
query.addCriteria(criteria);
List<Comment> comments = mongoTemplate.find(query, Comment.class);
return comments;
}
@Override
public List<Comment> findQueryComment() {
Criteria criteria = new Criteria();
//且比或简单
criteria.and("users.id").is("1").and("userid").is("100");
Query query = new Query();
query.addCriteria(criteria);
List<Comment> comments = mongoTemplate.find(query, Comment.class);
return comments;
}
@Override
public List<Comment> findQueryComment() {
Query query = new Query();
Criteria criteria = new Criteria();
//正则
criteria.and("userid").regex("^.*"+0+".*$");
query.addCriteria(criteria);
List<Comment> comments = mongoTemplate.find(query, Comment.class);
return comments;
}
@Override
public Long findQueryComment() {
Query query = new Query();
Criteria criteria = new Criteria();
//正则
criteria.and("userid").regex("^.*"+0+".*$");
query.addCriteria(criteria);
long count = mongoTemplate.count(query, Comment.class);
return count;
}
@Override
public List<Comment> findQueryComment() {
//条件
Query query = Query.query(Criteria.where("userid").is("1003"));
//排序规则 把id倒序
Sort sort = new Sort(Sort.Direction.DESC,"_id");
query.with(sort);
List<Comment> comments = mongoTemplate.find(query, Comment.class);
return comments;
}
@Override
public List<Comment> findQueryComment() {
//条件体
Query query = new Query();
//排序规则 把id倒序
Sort sort = new Sort(Sort.Direction.DESC,"_id");
//当前页+页的大小(当前页应该是实际页数减一)
PageRequest page = PageRequest.of(0, 2);
query.with(sort);
//分页 ===也可以用query.skip(当前页-1).limit(页的大小)
query.with(page);
List<Comment> comments = mongoTemplate.find(query, Comment.class);
return comments;
}
Criteria criteria = new Criteria();
criteria.and("users.id").is("1").and("userid").is("100");
//Aggregation.group("userid").count().as("total")
//count 聚合函数(和SQL一样)
Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria),
Aggregation.group("userid").count().as("total"),
Aggregation.sort(Sort.Direction.DESC, "total"));
//comment表名 JSONObject.class返回的类型,可以自行封装实体类属性名要和聚合的别名一样才可以注入,类似mybatis
AggregationResults<JSONObject> aggregate = mongoTemplate.aggregate(aggregation,
"comment", JSONObject.class);
List<JSONObject> Comments = aggregate.getMappedResults();
如果想在users的集合里加一条数据怎么办?
{
"_id":"5eec4eaeefe450068c1dc854",
"content":"我是简单的增加",
"userid":"100",
"createdatetime":"2020-06-19T05:35:42.389Z",
"likenum":10,
"parentid":"1003",
"articleid":"100",
"users":[
{
"_id":"1",
"name":"小明"
}
],
"_class":"com.hlxy.mongodb.pojo.Comment"
}
@Autowired
private MongoTemplate mongoTemplate;
@Override
public Long pushUser() {
Query q = Query.query(Criteria.where("_id").is("1"));
User user = new User();
user.setId("003");
user.setName("小米");
Update update = new Update();
//users是字段名 把user添加到users的集合中内嵌的数据
update.push("users",user);
UpdateResult updateResult = mongoTemplate.updateFirst(q, update, Comment.class);
return updateResult.getMatchedCount();
}
@Override
public Long pullUser() {
Query q = Query.query(Criteria.where("_id").is("1"));
User user = new User();
user.setId("003");
Update update = new Update();
//users是字段名 users中查找匹配的user删除
update.pull("users",user);
UpdateResult updateResult = mongoTemplate.updateFirst(q, update, Comment.class);
return updateResult.getMatchedCount();
}
update.pullAll(“字段”,集合)
update.set(“users.$.name”,“值”);//修改users.name为例子
在条件上一般加上"users.name"作为筛选条件
@Override
public Long updateComment() {
Query query = Query.query(Criteria.where("_id").is("5eec3048efe4502f201b7ea8"));
//修改条件-明确到修改users数组中的哪些数据,,没写则在全users数组中匹配
query.addCriteria(Criteria.where("users.name").is("小明")))
Update update = new Update();
update.set("users.$.name","数据改了");
UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Comment.class);
return updateResult.getMatchedCount();
}
如果是修改多条数据把$ 改成 $ []
update.set(“users.$[].name”,“数据全部改了”);
查询基本不变字段名:users.id
@Override
public List<Comment> find() {
Query query = Query.query(Criteria.where("users.id").is("003"));
List<Comment> comments = mongoTemplate.find(query, Comment.class);
return comments;
}
query.fields().include(“字段”); //包含该字段
query.fields().exclude(“字段”);//不包含该字段
@Override
public List<Comment> find() {
Query query = Query.query(Criteria.where("users.id").is("003"));
query.fields().exclude("users");
List<Comment> comments = mongoTemplate.find(query, Comment.class);
return comments;
}
// @Autowired
// private GridFsTemplate gridFsTemplate;---和mongoTemplate一样注入就好
ObjectId store = gridFsTemplate.store(file.getInputStream(), file.getOriginalFilename(), file.getContentType());
String fileId = store.toHexString();//文件id-下载要用-要保存起来
String id = fileId;//fileId是上传时返回的文件id
//根据文件id获取下载信息
GridFSFile file = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id)));
if(file!=null){
//获取文件
GridFsResource gridFsResource = new GridFsResource(file, GridFSBuckets.create(mongoTemplate.getDb()).openDownloadStream(file.getObjectId()));
//文件名称
String fileName = URLEncoder.encode(gridFsResource.getFilename(), "UTF-8");
//设置下载属性
response.setContentType(gridFsResource.getContentType());
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
ServletOutputStream outputStream = response.getOutputStream();
//把获取到的文件流输入到 response的输出流(下载)
IOUtils.copy(gridFsResource.getInputStream(),outputStream);
}
1.ES安装配置文件1.1主节点配置文件# ======================== Elasticsearch Configuration =========================# ---------------------------------- Cluster -----------------------------------cluster.name: GzEsCluster# ------------------------------------ Node
http://blog.itpub.net/26515977/viewspace-1208188/ 今天被MySQL Query Cache 炕了、线上大量 Waiting on query cache mutex 那么什么是 Query Cache? ...
Centos7查看:sudo systemctl status firewalld临关:sudo systemctl stop firewalld临开:sudo systemctl start firewalld永关:sudo systemctl disable firewalld查询防火墙服务是否开机启动:systemctl is-enabled firewalld查询已经启动...
前几天,因为网易邮箱有部分域名的ssl证书过期,导致很多苹果用户的手机遇到疯狂弹窗,提示无法验证服务器身份。在我看来,这肯定是运维的锅了。即使ssl厂商有续费提示,但是有可能因为人为的原因或者沟通的原因导致部分域名会忘记更换。所以每个https的域名都有必要添加上证书过期的提醒。(网易邮箱这次好像就是因为更换证书出现了遗漏)。如果你正在使用prometheus的作为监控工具,那么做ssl证书过期的...
本文旨在帮助读者将激光点云地图转为2D栅格地图,以便完成路径规划与导航。本方法将pcd转为pgm的原理是将接收到的点云信息以"/map"话题的形式发布,用map_server来接收"/map"话题,保存2D栅格地图!废话不多说,直接开始!一、安装pcd2pgm#创建工作空间mkdir -p ~/pcd2pgm_ws/srccd ~/pcd2pgm/srccatkin_init_workspace#克隆代码git clone https://github.com/hujiax380/
Chrome控制台报错:Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.解决办法:可能是扩展插件的BUG引起。尝试关闭或者移除报错的插件。
简介此处省略很多字下载社区版本下载网址:https://visualstudio.microsoft.com/zh-hans/downloads/选择安装路径建议为VS2019新建一个专属的文件夹,用于存储安装包,安装信息等在这里你可查看 快速入门指南,重命名安装包(建议重命名为名称+版本:比如 Visual Studio 2019)安装找到刚才安装包下载路径,双击运行开始安...
YCSB在测试的时候 有固定的表结构,所以以下插入、删除都是在同等条件下测试的。Hbase结果1)、使用load进行插入数据。 1线程插入条数 总吞吐量 总运行时间(ms) 1000 356.252226576416 2807 10000 ...
1.使用android反编译工具反编译(如改之理,AndroidKiller ,安桌助手,Smali2Java,APKDB 等2.找到AndroidManifest.xml文件方法一:将红色划线部分@string/app_name直接改成你想要的app名字方法二:找到 res\values\string.xml 文件 修改 app_name 就可以了.(推荐)...
最近因为选择工作,选择了一个和这完全不搭的工作,一直在写ppt,没时间搞这些东西,过几天有时间我写一下如何制作!
游戏直播哪家强?对大多数用户来说,这个答案并非绝对。但有一点是肯定的,直播内容和观看体验是用户最在意的选项。直播内容上大家各有所长,用户也有不同的钟爱口味,这一点上并不容易分高下。而直播流畅度则是一个偏技术的维度,用户感官上也比较容易分辨。 那么问题来了,当下游戏直播平台究竟哪家能够保证最流畅呢?带着这个问题我们对目前市面三家主流游戏直播平台——虎牙直播、斗鱼直播和熊猫直播进行了对比评测
h3 { box-shadow: 0 0 1px rgba(95, 90, 75, 1), 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: rgba(255, 255, 255, 1); font-family: 微软雅黑, 宋体, 黑体, Arial; font-size: 18px; font-weight: bold; height: 25px; ...