通过使用spring-data-mongodb操作mongodb
简单记录使用spring-data-mongodb来开发的一些问题
简介
mongo-java-driver和spring-data-mongodb的关系
mongo-java-driver是mongodb提供的官方开发包。目前最新版本3.4.1。
Document/MongoCollection/MongoDatabase
3.0.0版本以后推荐使用DBObject/DBCollection/DB
3.0.0版本以前的残余物,3.0.0版本以后不推荐使用
由于不可知的历史原因spring-data-mongodb的1.9.5.RELEASE版本中的MongoTemplate类和MongoOperations接口等相关方法类使用的依然是DBObject/DBCollection/DB。
spring-data-mongodb是spring组织在mongo-java-driver的基础上进行进一步封装的开发包。
本文章所描述的开发环境就是基于spring-data-mongodb的1.9.5.RELEASE版本
maven配置
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.9.5.RELEASE</version>
</dependency>
创建
private static MongoOperations createMongoOperations(String[] hosts, String databaseName,
String username, String admindb, String password,
ReadPreference readPreference) {
List<ServerAddress> seeds = new ArrayList<ServerAddress>();
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
MongoCredential mongoCredential = MongoCredential.createCredential(username, admindb, password.toCharArray());
for (String host : hosts) {
String[] tmphost = host.split(":");
if (tmphost.length > 1 && tmphost[1].length() > 0)
seeds.add(new ServerAddress(tmphost[0], Integer.parseInt(tmphost[1])));
else
seeds.add(new ServerAddress(tmphost[0]));
credentials.add(mongoCredential);
}
MongoTemplate mongoTemplate = new MongoTemplate(new MongoClient(seeds, credentials),
databaseName);
mongoTemplate.setReadPreference(readPreference);
return mongoTemplate;
}
插入insert
- 插入单条数据
User user = new User().setName("zhangsan").setAge(22).setSex("man");
mongoOperation.insert(user);
- 插入批量数据
List list = new ArrayList<>();
list.add(user1);
list.add(user2);
User user = new User().setName("zhangsan").setAge(22).setSex("man");
mongoOperation.insert(list,User.class);
查询find
- 查询所有数据
mongoOperation.findAll(User.class);
- 查询特定数据
Criteria criteria = Criteria.where("name").is("zhangsan");
Query query = Query.query(criteria);
mongoOperation.find(query,User.class);
- 查询特定数据并排序
Criteria criteria = Criteria.where("sex").is("man");
Query query = Query.query(criteria).with(new Sort(Sort.Direction.ASC, "age"));
mongoOperation.find(query,User.class);
- 查询特定数据并排序
Criteria criteria = Criteria.where("sex").is("man");
Query query = Query.query(criteria).with(new Sort(Sort.Direction.ASC, "age"));
mongoOperation.find(query,User.class);
- 查询特定数据并指定返回的需要的字段
Criteria criteria = Criteria.where("sex").is("man");
Query query = Query.query(criteria).with(new Sort(Sort.Direction.ASC, "age"));
query.fields().include("name");
mongoOperation.find(query,User.class);
更新update
- 更新单条数据
Criteria criteria = Criteria.where("name").is("zhangsan");
Query query = Query.query(criteria);
Update update = new Update().set("age",30);
mongoOperation.updateFirst(query, update, User.class);
- 更新多条数据
Criteria criteria = Criteria.where("name").is("zhangsan");
Query query = Query.query(criteria);
Update update = new Update().set("age",30);
mongoOperation.updateMulti(query, update, User.class);
- 更新如果不存在则新增
Criteria criteria = Criteria.where("name").is("zhangsan");
Query query = Query.query(criteria);
Update update = new Update().set("age",30);
mongoOperation.upsert(query, update, User.class);
只会将update中的字段新增到mongodb中,即:
{
"_id" : ObjectId("586df305e617c85d0e984e6a"),
"age" : 30
}
如果需要将name字段也保存可以这样:
Criteria criteria = Criteria.where("name").is("zhangsan");
Query query = Query.query(criteria);
Update update = new Update().set("name","zhangsan").set("age",30);
mongoOperation.upsert(query, update, User.class);