MongoDB集成:NoSQL数据库
MongoDB集成:NoSQL数据库
概述
MongoDB是流行的NoSQL文档数据库。本教程介绍Java与MongoDB的集成。
1. Spring Data MongoDB
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.repository.MongoRepository;
@Document(collection = "users")
public class User {
@Id
private String id;
private String name;
private String email;
private int age;
private Address address;
// 构造方法和getter/setter
}
public class Address {
private String city;
private String street;
private String zipCode;
// 构造方法和getter/setter
}
public interface UserRepository extends MongoRepository<User, String> {
List<User> findByName(String name);
List<User> findByAge(int age);
List<User> findByAddressCity(String city);
List<User> findByNameContaining(String keyword);
}
2. MongoDBTemplate
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
@Service
public class UserService {
private final MongoTemplate mongoTemplate;
public User findByEmail(String email) {
Query query = new Query(Criteria.where("email").is(email));
return mongoTemplate.findOne(query, User.class);
}
public List<User> findByAgeRange(int minAge, int maxAge) {
Query query = new Query(Criteria.where("age").gte(minAge).lte(maxAge));
return mongoTemplate.find(query, User.class);
}
public void updateName(String id, String newName) {
Query query = new Query(Criteria.where("id").is(id));
Update update = new Update().set("name", newName);
mongoTemplate.updateFirst(query, update, User.class);
}
public void insertUser(User user) {
mongoTemplate.insert(user);
}
}
3. 实际应用示例
日志存储
@Document(collection = "logs")
public class LogEntry {
@Id
private String id;
private String level;
private String message;
private String service;
private Map<String, Object> metadata;
private LocalDateTime timestamp;
// 构造方法和getter/setter
}
@Service
public class LogService {
public void saveLog(LogEntry logEntry) {
mongoTemplate.insert(logEntry);
}
public List<LogEntry> searchLogs(String keyword, LocalDateTime startTime, LocalDateTime endTime) {
Query query = new Query(Criteria.where("message").regex(keyword, "i")
.and("timestamp").gte(startTime).lte(endTime));
return mongoTemplate.find(query, LogEntry.class);
}
public Map<String, Long> countByLevel() {
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.group("level").count().as("count"),
Aggregation.project("count").and("level").previousOperation()
);
AggregationResults results = mongoTemplate.aggregate(aggregation, "logs", LogEntry.class);
// 处理结果
}
}
用户画像
@Document(collection = "user_profiles")
public class UserProfile {
@Id
private String userId;
private List<String> interests;
private Map<String, Object> preferences;
private List<String> tags;
// 构造方法和getter/setter
}
@Service
public class UserProfileService {
public void updateInterests(String userId, List<String> interests) {
Query query = new Query(Criteria.where("userId").is(userId));
Update update = new Update().set("interests", interests);
mongoTemplate.upsert(query, update, UserProfile.class);
}
public List<UserProfile> findByInterest(String interest) {
Query query = new Query(Criteria.where("interests").in(interest));
return mongoTemplate.find(query, UserProfile.class);
}
}
4. 最佳实践
- 设计合理的数据模型:根据查询需求设计文档结构
- 使用索引:为常用查询字段创建索引
- 批量操作:使用批量操作提高性能
- 数据验证:使用验证器确保数据质量
- 备份策略:定期备份MongoDB数据
总结
MongoDB是流行的NoSQL文档数据库。掌握Java与MongoDB的集成,可以构建灵活、可扩展的数据存储系统。