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

时间:2021-6-12 作者:qvyue

一、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
{
    List findByAlias(String alias);

    @Query("{'platform':?0,'idType':?1,'idValue':?2, 'expireTime' :{'$gt': ?3}}")
    List findByCondition(String platform, Byte idType, String idValue, Date gtExpireTime);

    @Query("{'did':?0}")
    List findByDid(String did);
    
    @Query("{'userId':?0, 'idType':?1, 'platform':?2, 'expireTime' :{'$gt': ?3}}")
    List findByCondition(Long userId, Byte idType, String platform, Date now);
    
    @Query("{'userId':{'$in':?0}, 'idType':?1, 'platform':?2, 'expireTime' :{'$gt': ?3}}")
    List findByCondition(Collection 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 list = new ArrayList();
list.add(query);
list.add(query2);
list.add(query3);
AggregateIterable 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 list = mongoTemplate.aggregate(aggregation, "device_day_data", AccDeviceDayData.class).getMappedResults();

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

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。