SpringBoot2.1.9 MongoDB逻辑操作
一、基础类配置
@NoRepositoryBean
public interface IMongoRepository<T, ID> extends MongoRepository<T, ID> {
String getTableName();
void deleteAll(Collection<ID> ids);
MongoOperations getMongoOperations();
MongoEntityInformation<T, ID> getEntityInformation();
Class<T> getEntityClass();
Class<ID> getIdClass();
}
public class AbstractMongoRepository<T, ID> extends SimpleMongoRepository<T, ID> implements IMongoRepository<T, ID> {
private final MongoOperations mongoOperations;
private final MongoEntityInformation<T, ID> entityInformation;
public AbstractMongoRepository(MongoEntityInformation<T, ID> metadata, MongoOperations mongoOperations) {
super(metadata, mongoOperations);
this.mongoOperations = mongoOperations;
this.entityInformation = metadata;
}
@Override
public String getTableName(){
return entityInformation.getCollectionName();
}
@Override
public void deleteAll(Collection<ID> ids) {
ids.forEach(this::deleteById);
}
@Override
public MongoOperations getMongoOperations() {
return mongoOperations;
}
@Override
public MongoEntityInformation<T, ID> getEntityInformation() {
return entityInformation;
}
@Override
public Class<T> getEntityClass() {
return entityInformation.getJavaType();
}
@Override
public Class<ID> getIdClass() {
return entityInformation.getIdType();
}
}
@SpringBootApplication
@EnableMongoRepositories(repositoryBaseClass = AbstractMongoRepository.class)
public class MongoApplication {
public static void main(String[] args) {
SpringApplication.run(MongoApplication.class, args);
}
}
而、查询
(1)普通查询
public interface UserRepository extends IMongoRepository<User, ObjectId> {
//jpa根据名字自动适配查询
List<User> findByName(String name);
List<User> findByNameAndAge(String name, int age);
//手动指定查询
default List<User> listByNameAndAge(String name, int age){
Query q = new Query(Criteria.where(User.Fields.name).is(name)
.and(User.Fields.age).is(age));
return this.getMongoOperations().find(q, this.getEntityClass());
}
default List<User> find(ObjectId id){
Query q = new Query(Criteria.where("_id").is(id));
return this.getMongoOperations().find(q, this.getEntityClass());
}
default Optional<User> find2(ObjectId id){
return this.findById(id);
}
default List<User> listByAge(int ageMin,int ageMax) {
Query q = new Query(Criteria.where(User.Fields.name).exists(true)
.andOperator(Criteria.where(User.Fields.age).gte(ageMin),
Criteria.where(User.Fields.age).lt(ageMax)));
return this.getMongoOperations().find(q, User.class, this.getTableName());
}
}
(2)排序
public interface UserRepository extends IMongoRepository<User, ObjectId> {
default List<User> listSort(int age){
Query q = new Query(Criteria.where(User.Fields.age).is(age));
q.with(Sort.by(Sort.Order.desc(User.Fields.name), Sort.Order.desc(User.Fields.age)));
return this.getMongoOperations().find(q, this.getEntityClass());
}
}
(3)分页
public interface UserRepository extends IMongoRepository<User, ObjectId> {
default List<User> listLimit(int age){
Query q = new Query(Criteria.where(User.Fields.age).is(age));
q.skip(50).limit(10);
return this.getMongoOperations().find(q, this.getEntityClass());
}
}
二、更新
public interface UserRepository extends IMongoRepository<User, ObjectId> {
default void update(User user){
this.save(user);
}
default long updateAge(ObjectId id, int age){
Query q = new Query(Criteria.where("_id").is(id));
Update update = new Update();
update.set(User.Fields.age, age);
return this.getMongoOperations().updateFirst(q, update, getTableName()).getModifiedCount();
}
default long updateAge(String name, int age){
Query q = new Query(Criteria.where(User.Fields.name).is(name));
Update update = new Update();
update.set(User.Fields.age, age);
return this.getMongoOperations().updateMulti(q, update, getTableName()).getModifiedCount();
}
}
三、删除
public interface UserRepository extends IMongoRepository<User, ObjectId> {
default void delete(ObjectId id){
this.deleteById(id);
}
default void delete1(User user){
this.delete(user);
}
default DeleteResult delete2(ObjectId id){
Query q = new Query(Criteria.where("_id").is(id));
return this.getMongoOperations().remove(q, getTableName());
}
}
四、索引
public interface UserRepository extends IMongoRepository<User, ObjectId> {
default void createIndex() {
MongoCollection<Document> collection = getMongoOperations().getCollection(getTableName());
BasicDBObject indexOptions = new BasicDBObject();
indexOptions.put(User.Fields.name, -1);
String alarmSummaryId = collection.createIndex(indexOptions);
indexOptions = new BasicDBObject();
indexOptions.put(User.Fields.age, 1);
String createAt = collection.createIndex(indexOptions);
}
}
五、聚合
public interface UserRepository extends IMongoRepository<User, ObjectId> {
default Map<ObjectId,String> listAgeFirstCity(int skip, int limit){
Criteria criteria = Criteria.where(User.Fields.city).exists(true);
Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria),
Aggregation.group(User.Fields.age).first( "$city").as( "city"),
Aggregation.skip(skip), Aggregation.limit(limit));
List<Map> list = this.getMongoOperations().aggregate(aggregation, getTableName(), Map.class).getMappedResults();
Map<ObjectId, String> data = new HashMap<>();
for(Map<String,Object> map : list){
data.put((ObjectId) map.get("_id"), (String)map.get("city"));
}
return data;
}
}
六、连接
public interface UserRepository extends IMongoRepository<User, ObjectId> {
default List<UserVo> list() {
LookupOperation lookupOperation= LookupOperation.newLookup().
from(AdminRepository.instance().getTableName()). //关联从表名
localField(User.Fields.name). //主表关联字段
foreignField(Admin.Fields.name).//从表关联的字段
as("adminInfo"); //查询结果名
Criteria left = Criteria.where(User.Fields.city).exists(true)
.andOperator(Criteria.where(User.Fields.age).gte(18),
Criteria.where(User.Fields.age).lt(65));
Criteria right = Criteria.where("adminInfo.0").exists(true).and("adminInfo.0.admin").is(1);
Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(left), lookupOperation,
Aggregation.match(right), Aggregation.unwind("adminInfo", true));
List<UserVo> results = this.getMongoOperations().aggregate(aggregation, this.getTableName(), UserVo.class).getMappedResults();
return results;
}
@Setter
@Getter
public static class UserVo extends User{
private Admin adminInfo;
}
}