美文网首页
mongo回顾(十一:与Spring结合)

mongo回顾(十一:与Spring结合)

作者: supremecsp | 来源:发表于2021-04-23 17:45 被阅读0次

    一、spring-data-mongodb
      Spring Data是Spring专门用来数据处理的一个子项目,Spring Data除了spring-data-mongodb之外还包括spring-data-jp、spring-data-redis等项目。spring-data-mongodb就是针对mongodb的一个项目。通过它我们可以对nongodb进行操作。
    二,mongo与spring整合后有两种方式操作mongo
    MongoTemplate 和MongoRepository
    三,MongoRepository
    MongoRepository是一个接口,可以定义一个类来实现接口,也可以定义一个接口来继承该接口
    定义一个接口时,
    可以在改接口直接写原生的find指令,使用@Query注解
    可以自定义查询方法,格式为“findBy+字段名+方法后缀”,方法传进的参数即字段的值,此外还支持分页查询,通过传进一个Pageable 对象,返回Page集合。

    public interface UserAliasLogRepository extends MongoRepository<UserAliasLog, Long>
    {
        List<UserAliasLog> findByAlias(String alias);
    
        @Query("{'platform':?0,'idType':?1,'idValue':?2, 'expireTime' :{'$gt': ?3}}")
        List<UserAliasLog> findByCondition(String platform, Byte idType, String idValue, Date gtExpireTime);
    
        @Query("{'did':?0}")
        List<UserAliasLog> findByDid(String did);
        
        @Query("{'userId':?0, 'idType':?1, 'platform':?2, 'expireTime' :{'$gt': ?3}}")
        List<UserAliasLog> findByCondition(Long userId, Byte idType, String platform, Date now);
        
        @Query("{'userId':{'$in':?0}, 'idType':?1, 'platform':?2, 'expireTime' :{'$gt': ?3}}")
        List<UserAliasLog> findByCondition(Collection<Long> userIds, Byte idType, String platform, Date now);
    }
    

    @Query也仅仅只能支持find的查询功能,复杂的聚合查询都不支持,其他功能需要依赖bean来进行处理(只能简单的增删改查操作)

        @Autowired
        private UserAliasLogRepository userAliasLogRepository;
    
        userAliasLogRepository.save(userAliasLog);
    

    四,MongoTemplate
    MongoTemplate 功能更加丰富,所有基本的操作通过MongoTemplate 都可以做到,做不到也能使用原生语法支持,强推
    接下来简单的演示聚合操作用原生和用api的两种实现方式

    BasicDBObject query = BasicDBObject.parse("{$match:{did:\"123456789\"}}");
    BasicDBObject query2 = BasicDBObject.parse("{$addFields:{sumkwh: {$sum : \"$infos.kwh\"},\"test\": \"ss\"}}");
    BasicDBObject query3 = BasicDBObject.parse("{$project:{_id:0}}");
    List<BasicDBObject> list = new ArrayList<>();
    list.add(query);
    list.add(query2);
    list.add(query3);
    AggregateIterable<Document> device_day_data = mongoTemplate.getCollection("device_day_data").aggregate(list);
    MongoCursor iterator = device_day_data.iterator();
    //          xxxx
    while(iterator.hasNext()){
         Document data = (Document) iterator.next();
    //  xxxx
     };
    
    MatchOperation matchOperation = match(Criteria.where("did").is("123456789"));
    
    AggregationOperation addFields = (context)->new Document("$addFields", new Document("kwh", new Document("$sum", "$infos.kwh")));
    
    ProjectionOperation projectionOperation = project().andExclude("_id");
    
    Aggregation aggregation =  Aggregation.newAggregation(matchOperation, addFields, projectionOperation);
    
    List<AccDeviceDayData> list = mongoTemplate.aggregate(aggregation, "device_day_data", AccDeviceDayData.class).getMappedResults();
    

    有时候比较复杂的操作用api转化起来比较麻烦的话,可以试试BasicDBObject

    相关文章

      网友评论

          本文标题:mongo回顾(十一:与Spring结合)

          本文链接:https://www.haomeiwen.com/subject/qbncrltx.html