一、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
网友评论