由于在项目中遇到了需要在后台服务器上通过java代码直接操作MongoDB数据库,故写入此博客以作复习备忘之用。
总结:
(2020.05.07更新)想在java中直接实现对MongoDB数据库的push,set,pop操作,需要用到MongoTemplate。这里的是利用Spring中自动注入的方式生成实例,你也可以直接new一个对象。重点在于操作语句的写法。
@Autowired
MongoTemplate m;
//set
m.updateMulti(
new Query(Criteria.where("_id").is("你要找的id")),
new Update().set("你要找的属性", "属性要修改的内容"),
java中对应的类.class,
"mongo中对应的数据库表名称"
);
//push
m.updateMulti(
new Query(Criteria.where("_id").is("你要找的id")),
new Update().push("对应的属性",要插入的内容),
java中对应的类.class,
"对应的表名称"
);
//pop
m.updateMulti(
new Query(Criteria.where("_id").is("你要找的id")),
new Update().pop("对应的属性,比如它包含一个数组",Update.Position.FIRST),
java中对应的类.class,
"对应的表名称"
);
对于pop,Update.Position.FIRST对应着删除的是头元素,把FIRST改成LAST就是删除尾部元素。
如果觉得不够形象,就看下面的例子
1. 先看在MongoDB数据库里的操作方式:
1.1 直接来操作语句的语法:
db.对应的表名称.update(
{"_id":“你要修改元素的id”} ,
{$操作符:{“要修改的属性名”:具体如何修改的地方}}
);
1.2 直接举例说明:
1.2.1 先看set操作,他可以用来修改,比如我这里把sheet_name这个属性对应的名称修改了:
db.sheets.update(
{"_id":"bombom"},
{$set:{"sheet_name":"csdn666"}}
);
1.2.2 再看push操作,通过这个操作可以往对应的数组元素中push新的值,这个也是自己在项目中用的比较多的操作:
db.sheets.update(
{"_id":"bombom"},
{$push:{"score":[1,2,3,4,5]}}
);
我这里是个二维数组,现在push了一个新的数组进入,当然我也可以只push一个数而不是数组,只需要将刚才update操作中的数组改成一个数即可:
db.sheets.update(
{"_id":"bombom"},
{$push:{"score":12}}
);
1.2.3 pop操作方式如下:
db.sheets.update(
{"_id":"bombom"},
{$pop:{"score":-1}}
);
注意,这里的-1表示删掉数组的头部的元素,1表示删除尾部的元素。
2. 接下来是在Spring Boot项目中利用MongoTemplate的操作方式。
2.1 首先你要在application.properties文件中建立好数据库链接,这里不过多讲述。然后你要创建一个对象,并且通过注解@的方式和你对应的数据库的Collection名称绑定:
@Document(collection = "sheets") //这里和刚才的表一样,都叫sheets
public class csdn {
@Id
private String id;
private String sheet_name;
private int[][] score;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSheet_name() {
return sheet_name;
}
public void setSheet_name(String sheet_name) {
this.sheet_name = sheet_name;
}
public int[][] getScore() {
return score;
}
public void setScore(int[][] score) {
this.score = score;
}
}
2.2 创建好class之后需要利用MongoTemplate。先看通用的操作语法为:
mongoTempalte.updateMulti(
new Query(Criteria.where("_id").is("对应的id")),
new Update().操作符("属性名":操作方式),
对应的java对象.class,
"对应的数据库表的名称"
);
2.3 然后依旧还是看对应的例子 :
(2020.05.07更新)这里的例子都是在Spring Boot环境下调用的,实际上可以忽略掉除了mongotemplate之外的代码。
2.3.1 首先依然是set操作:
@RestController
@RequestMapping("/action")
public class Action {
@Autowired
MongoTemplate mongoTemplate;
@GetMapping("/test")
public void test(){
mongoTemplate.updateMulti(
new Query(Criteria.where("_id").is("bombom")),
new Update().set("sheet_name","csdn888"),
csdn.class,
"sheets"
);
}
}
2.3.2同理,push也很简单:
@RestController
@RequestMapping("/action")
public class Action {
@Autowired
MongoTemplate mongoTemplate;
@GetMapping("/test")
public void test(){
int[] in={9,8,7};
mongoTemplate.updateMulti(
new Query(Criteria.where("_id").is("bombom")),
new Update().push("score",in),
csdn.class,
"sheets"
);
}
}
2.3.3 稍微复杂一点的是pop操作:因为pop要利用到Position的接口,而不能直接输入数字,代码如下:
@RestController
@RequestMapping("/action")
public class Action {
@Autowired
MongoTemplate mongoTemplate;
@GetMapping("/test")
public void test(){
mongoTemplate.updateMulti(
new Query(Criteria.where("_id").is("bombom")),
new Update().pop("score", Update.Position.FIRST),
csdn.class,
"sheets"
);
}