1. 程式人生 > 其它 >LeetCode 5644. 得到子序列的最少操作次數(最長上升子序DP nlogn)

LeetCode 5644. 得到子序列的最少操作次數(最長上升子序DP nlogn)

Spring Data MongoDB

相關依賴:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

配置檔案application.yml

spring:
  data:
    mongodb:
      host: 192.168.1.43
      port: 27017
      username: root
      password: root
      authentication-database: admin
      database: test 

啟動springboot專案:

註解描述實體型別

Id註解,是springdata提供的一個公共註解,用來描述實體型別中的主鍵屬性.

在springdata-mongodb環境中,如果實體型別的屬性命名為id或_id時,且這個屬性就是主鍵屬性時,可以省略Id註解.

只有主鍵型別為String或ObjectId型別時,MongoDB才能自動生成,其他型別的主鍵必須手工賦值。

@Document("user")//對應哪一個集合
@Data@EqualsAndHashCode
public class User implements Serializable {

    @Id
    private Long id;
    /**
     * field註解,用來描述型別的屬性和集合中的欄位的對映關係
     */
    @Field("name")
    private String username;
    private String password;
    private String email;
    private List<String> courses;
}

新增資料

    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void contextLoads() {
        User user = new User();
        user.setId(100L);
        user.setUsername("wj");
        user.setPassword("wj");
        user.setEmail("[email protected]");
        user.setCourses(Arrays.asList("spring","dubbo"));
        mongoTemplate.insert(user);
    }

當我們的實體類什麼springdata註解都沒有加上時,也是可以插入成功的:

@Data
@EqualsAndHashCode
public class Item {
    private String code;
    private Integer num;
    private Double price;
}

    @Test
    public void testInsert(){
        Item item = new Item();
        item.setCode("123");
        item.setNum(11);
        item.setPrice(22.5);
        mongoTemplate.insert(item);
    }

儲存資料save

save方法:如果存在該條資料則直接覆蓋原資料(判斷主鍵是否相同),不存在則新增。

    public void testSave(){
        User user = new User();
        user.setUsername("aaa");
        user.setId(101L);
        user.setCourses(Arrays.asList("spring","dubbo"));
        mongoTemplate.save(user);

        User user2 = new User();
        user2.setUsername("wj2");
        user2.setId(100L);
        mongoTemplate.save(user2);
    }

更新資料

更新單一資料

updateFirst方法的三個引數:

  • query:匹配條件
  • update:更新內容
  • Class:通過型別來找對應的集合
    @Test
    public void testUpdate(){
        Query query = new Query();
        query.addCriteria(Criteria.where("name").is("wj2"));
        Update update = new Update();
        update.set("name","wj3");
        update.set("email","[email protected]");
        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, User.class);
        System.out.println(updateResult.getMatchedCount());//匹配行數
        System.out.println(updateResult.getModifiedCount());//修改行數
    }

更新多資料

    @Test
    public void testUpdateMulti(){
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").lte(200));
        Update update = Update.update("password","123456");
        mongoTemplate.updateMulti(query,update,User.class);
    }

更新或新增

更新,如果更新資料不存在,則新增

    @Test
    public void testUpset(){
        Query query = new Query();
        query.addCriteria(Criteria.where("name").is("zhangsan"));
        Update update = Update.update("password", "123");
        mongoTemplate.upsert(query,update,User.class);
    }

發現使用upset插入的資料,類的型別丟失,所以不建議使用upset。

刪除

根據條件刪除

    @Test
    public void testDelete(){
        Query query = new Query();
        query.addCriteria(Criteria.where("name").is("zhangsan"));
        mongoTemplate.remove(query,User.class);
    }

根據主鍵刪除

根據java物件刪除資料,Spring Data MongoDB找到這個物件對應的集合,使用主鍵作為條件刪除。

    @Test
    public void testDeleteByObj(){
        User user = new User();
        user.setId(100L);
        user.setUsername("哈哈哈");
        mongoTemplate.remove(user);
    }

查詢資料

查詢全部資料

    @Test
    public void testFind(){
        List<User> users = mongoTemplate.findAll(User.class);
        users.forEach(System.out::println);
    }

單資料查詢

有兩種:findOne和findById

    @Test
    public void findOne(){
        Query query = new Query();
        query.addCriteria(Criteria.where("name").is("wj3"));
        User one = mongoTemplate.findOne(query, User.class);
        System.out.println(one);

        User user = mongoTemplate.findById(101L, User.class);
        System.out.println(user);
    }

條件查詢

    @Test
    public void testQuery(){

        Query query = new Query();
        query.addCriteria(
        //範圍查詢
                Criteria.where("_id").lt(103L).gte(100L)
        );

        List<User> users = mongoTemplate.find(query, User.class);
        users.forEach(System.out::println);
    }

正則查詢:不需要寫正則的起始和結束標記

    @Test
    public void testQuery(){
        Query query = new Query();
        query.addCriteria(
                Criteria.where("name").regex("wj")
        );
        List<User> users = mongoTemplate.find(query, User.class);
        users.forEach(System.out::println);
    }

複合多條件查詢

查詢密碼中包含5且主鍵小於103的User

    @Test
    public void find(){
        Query query = new Query();
        Criteria criteria = new Criteria();
        criteria.andOperator(Criteria.where("password").regex("5"),Criteria.where("_id").lt(103L));
        query.addCriteria(criteria);
        List<User> users = mongoTemplate.find(query, User.class);
        users.forEach(System.out::println);
    }

查詢密碼中包含5或主鍵小於103的User

    @Test
    public void find(){
        Query query = new Query();
        Criteria criteria = new Criteria();    criteria.orOperator(Criteria.where("password").regex("5"),Criteria.where("_id").lt(103L));
        query.addCriteria(criteria);
        List<User> users = mongoTemplate.find(query, User.class);
        users.forEach(System.out::println);
    }

排序

    @Test
    public void order(){
        Query query = new Query();
        //主鍵降序排列
        query.with(Sort.by(Sort.Direction.DESC,"_id"));
        List<User> users = mongoTemplate.find(query, User.class);
        users.forEach(System.out::println);
    }

分頁

頁碼從0開始

    @Test
    public void page(){
        Query query = new Query();
        query.with(PageRequest.of(1,2));
        List<User> users = mongoTemplate.find(query, User.class);
        users.forEach(System.out::println);
    }

排序再分頁

    @Test
    public void page(){
        Query query = new Query();
        query.with(PageRequest.of(1,2,Sort.by(Sort.Direction.DESC,"_id")));
        List<User> users = mongoTemplate.find(query, User.class);
        users.forEach(System.out::println);
    }

聚合

    @Test
    public void agg(){
        GroupOperation count = Aggregation.group().count().as("count");
        TypedAggregation<User> aggregation = TypedAggregation.newAggregation(User.class, count);
        AggregationResults<Map> result = mongoTemplate.aggregate(aggregation, Map.class);
        Map map = result.getUniqueMappedResult();
        System.out.println(map);
    }