springboot+mongodb 整合的一些使用

  • mongodb的配置
spring:
  data:
    mongodb:
      uri: mongodb://139.9.183.232:27019/users-1

如果有密码

spring:
  data:
    mongodb:
      uri: mongodb://帐号:密码@139.9.183.232:27019/users-1
  • 操作

两种使用方式:MogoTemplate 和 继承 MogoRepository接口,类似于JPA操作

实体定义

@Document(collection = "user") // 文档集合的名称
public class User {

    @Id //定义主键
    private Integer id;
    @Field(value = "name")  // 定义属性的名称
    private String name;
    private String sex;

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
  • MongoTemplate 操作

插入

public <T> T insert(T objectToSave)  // 如果有@Document(collection = "user") 则使用collection的值,否则使用实体的小写类名,如果存在相同的主键则会抛出异常
public <T> T insert(T objectToSave, String collectionName) 

插入/更新

public <T> T save(T objectToSave) // 如果有@Document(collection = "user") 则使用collection的值,否则使用实体的小写类名,如何有相同的主键,则会进行更新操作
public <T> T save(T objectToSave, String collectionName) // 指定collection

批量插入

public <T> Collection<T> insertAll(Collection<? extends T> objectsToSave) 
public <T> Collection<T> insert(Collection<? extends T> batchToSave, String collectionName) // 可指定collection

批量插入并指定实体class

public <T> Collection<T> insert(Collection<? extends T> batchToSave, Class<?> entityClass)

查询操作

public Criteria and(String key) 
public static Criteria byExample(Example<?> example)
public static Criteria byExample(Object example) 
public static Criteria where(String key)
public Criteria(String key)

相关操作词

public Criteria is(@Nullable Object o)  // 等于
public Criteria ne(@Nullable Object o)  // 不等于
public Criteria lte(Object o)   // 小于等于
public Criteria lt(Object o)    // 小于
public Criteria gt(Object o)  // 大于等于
public Criteria gte(Object o)    // 大于
public Criteria in(Object... o) // 在数组里面
public Criteria in(Collection<?> c)  // 在集合里面
public Criteria all(Object... o)    // 满足里面的所有条件
public Criteria all(Collection<?> o) // 满足集合里面的所有条件
public Criteria nin(Object... o)  // 不在数组里面
public Criteria nin(Collection<?> o) // 不在集合里面
public Criteria mod(Number value, Number remainder) // 取模 第二个参数量模的值 
public Criteria size(int s)   /////////////
public Criteria exists(boolean b) // 匹配包含该字段的文档
public Criteria type(int t) // 指定字符类型


public Criteria regex(String re)  // 正则规则
public Criteria regex(Pattern pattern)

public Criteria near(Point point)   // 距离操作
public Criteria nearSphere(Point point)
public Criteria maxDistance(double maxDistance)
public Criteria minDistance(double minDistance) 

orOperator()  // 或者一个Criteria操作
public Criteria norOperator(Criteria... criteria) //指定一个至少包含两个表达式的数组,选择出都不满足该数组中所有表达式的文档。
andOperator() // 与一个Criteria操作

Query的操作词

public Query skip(long skip)
public Query limit(int limit)

单条件查询

Query query = new Query(Criteria.where("id").lt(10));
List<User> users = mongoTemplate.find(query, User.class, "user"); // user 是collection
System.out.println(users);
  • 更新

Update

public static Update update(String key, Object value) // 静态调用
public Update set(String key, Object value)    // 修改并设置值
public Update setOnInsert(String key, Object value)  // 如何更新字段不存在则设置,如果更新字段存在则不设置
public Update unset(String key) // 删除存在的字段 key 
public Update inc(String key, Number inc) // 自增字段数值
public void inc(String key) // 自增字段数值

    -- 针对数组的操作 --
public Update push(String key, Object value) // 操作的是一个数组,有重复也会添加进去
public Update addToSet(String key, Object value) // 操作的是一个数组,有重复数据不会添加进去
public Update pop(String key, Update.Position pos) // 弹出数据,并删除,pos有两个Enum数据,Update.Position.FIRST、Updatea.Position.LAST 
public Update pull(String key, Object value) // 删除数组中的数据
public Update pullAll(String key, Object[] values) // 批量删除数组中的数据

    -- 其他操作  --
public Update rename(String oldName, String newName) // 重新命名
public Update currentDate(String key) // 更新成当前时间
public Update currentTimestamp(String key) //当前时间截
public Update multiply(String key, Number multiplier)  // 乘法运算
public Update max(String key, Object value) // 取最大值保存
public Update min(String key, Object value) //取最小值保存

@Test
    void testUpdate() {
        Query query = new Query(Criteria.where("_id").is(14));
        Update update = new Update();
        //update.set("num",1);
        //update.setOnInsert("name1", "李四");
        //update.unset("name1");
        //update.inc("num");
        //update.push("name1", Arrays.asList(9,23));
        //update.addToSet("name1",Arrays.asList(9,23,12,1212));
        //update.pop("name1", Update.Position.FIRST);
        //update.pull("name1", Arrays.asList(9,23));
        //update.pullAll("name1",new Object[]{Arrays.asList(9,23),Arrays.asList(9,23,12,1212)});
        //update.rename("name1","name2");
        //update.currentTimestamp("name2");
        //update.multiply("num", 2);
        //update.min("num", 4);

        UpdateResult user = mongoTemplate.updateFirst(query, update, "user");
    }

删除

DeleteResult remove(Object)   // 移除数据, Object是数据对象,操作的collection是操作对象的数据对象类名的小写
DeleteResult remove(Object, String)   // Object是数据对象,collection名称
DeleteResult remove(Query, String)   // 查询条件,
DeleteResult remove(Query, Class<?>)   
DeleteResult remove(Query, Class<?>, String)
// 当id是主键时,内容的列名会变成_id,所以查询条件要使用"_id"
Query query = new Query(Criteria.where("name").is("张三1"));
mongoTemplate.remove(query, "user");

分页与排序

Pageable pageable = PageRequest.of(0,50); //分页
// 分页并排序 
Sort sort = Sort.by(Sort.Direction.DESC, "_id"); //第二个参数 String... properties
Pageable pageable = PageRequest.of(0,50, sort);
// 分页并排序
Sort.Order order = Sort.Order.desc("_id");
Sort sort = Sort.by(order);
Pageable pageable = PageRequest.of(0,50, sort);
//条件匹配
ExampleMatcher matcher = ExampleMatcher.matching()
                .withMatcher("name", ExampleMatcher.GenericPropertyMatchers.contains());  // 匹配规则
// ignoreCase() 忽略大小写
// caseSensitive() 严格大小写
// contains() 包含
// endsWith() 以...结束
// startsWith() 以...开始
// exact() 精确匹配
// storeDefaultMatching() 默认(精确匹配)
// regex() 正则匹配
Example<User> example = Example.of(实体条件, matcher);

完!