← 返回首页
🗄️

MongoDB集成:NoSQL数据库

📂 java ⏱ 2 min 326 words

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. 最佳实践

  1. 设计合理的数据模型:根据查询需求设计文档结构
  2. 使用索引:为常用查询字段创建索引
  3. 批量操作:使用批量操作提高性能
  4. 数据验证:使用验证器确保数据质量
  5. 备份策略:定期备份MongoDB数据

总结

MongoDB是流行的NoSQL文档数据库。掌握Java与MongoDB的集成,可以构建灵活、可扩展的数据存储系统。