zoukankan      html  css  js  c++  java
  • 《 mongodb 学习 》java 基本操作

    环境 springboot 结合 monggodb

    一、pom.xml

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

    配置:

    spring.data.mongodb.uri=mongodb://localhost:27017/pglyon

    二、实体类 Users.java

    import org.springframework.data.annotation.Transient;
    import org.springframework.data.mongodb.core.index.CompoundIndex;
    import org.springframework.data.mongodb.core.index.CompoundIndexes;
    import org.springframework.data.mongodb.core.index.Indexed;
    import org.springframework.data.mongodb.core.mapping.Document;
    
    @Document(collection="users")
    @CompoundIndexes({
        @CompoundIndex(name = "age_idx", def = "{'name': 1, 'age': -1}")
    })
    public class Users implements Serializable{
        private static final long serialVersionUID = 1L;
        @Indexed
        private String uid;
        private String name;
        private int age;
        @Transient
        private String address;
        
        public Users(String uid, String name, int age) {
            super();
            this.uid = uid;
            this.name = name;
            this.age = age;
        }

    注解说明

    @Document

    标注在实体类上,与hibernate异曲同工。

    @Document(collection="users")
    public class Users  implements Serializable{
        private static final long serialVersionUID = 1L;
        ...省略代码
     

    @CompoundIndex

    复合索引,加复合索引后通过复合索引字段查询将大大提高速度。

    @Document(collection="users")
    @CompoundIndexes({
        @CompoundIndex(name = "age_idx", def = "{'name': 1, 'age': -1}")
    })
    public class Users  implements Serializable{
        private static final long serialVersionUID = 1L;
        ...省略代码

    @Id

    MongoDB默认会为每个document生成一个 _id 属性,作为默认主键,且默认值为ObjectId,可以更改 _id 的值(可为空字符串),但每个document必须拥有 _id 属性。
    当然,也可以自己设置@Id主键,不过官方建议使用MongoDB自动生成。

    @Indexed

    声明该字段需要加索引,加索引后以该字段为条件检索将大大提高速度。 
    唯一索引的话是@Indexed(unique = true)。 
    也可以对数组进行索引,如果被索引的列是数组时,mongodb会索引这个数组中的每一个元素。

    @Indexed
    private String uid;

    @Transient

    被该注解标注的,将不会被录入到数据库中。只作为普通的javaBean属性。

    @Transient
    private String address;

    生成的集合 以及结构


    三、业务接口 UserService.java:
    public interface UserService {
        
        public void saveUsers(List<Users> users);
        
        public void saveUser(Users users);
    
        public Users findUserByName(String name);
    
        public void removeUser(String name);
    
        public void updateUser(String name, String key, String value);
    
        public List<Users> listUser();
    }
    View Code

    实现类

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.mongodb.core.MongoOperations;
    import org.springframework.data.mongodb.core.query.Criteria;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.data.mongodb.core.query.Update;
    import org.springframework.stereotype.Service;
    
    import com.lyon.mongo.entity.Users;
    import com.lyon.mongo.service.UserService;
    
    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired
        MongoOperations mongoTemplate;
        
        @Override
        public void saveUser(Users users) {
            mongoTemplate.save(users);
        }
    
        @Override
        public Users findUserByName(String name) {
            
            return mongoTemplate.findOne(
                    new Query(Criteria.where("name").is(name)), Users.class);
        }
    
        @Override
        public void removeUser(String name) {
            mongoTemplate.remove(
                    new Query(Criteria.where("name").is(name)), Users.class);
        }
    
        @Override
        public void updateUser(String name, String key, String value) {
            mongoTemplate.updateFirst(new Query(Criteria.where("name").is(name)),
                    Update.update(key, value), Users.class);
        }
    
        @Override
        public List<Users> listUser() {
            return mongoTemplate.findAll(Users.class);
        }
    
        @Override
        public void saveUsers(List<Users> users) {
            for (Users users2 : users) {
                mongoTemplate.save(users2);
            }
        }
    
    }

    四、Controller

    @RequestMapping("/mongo")
    @Controller
    public class MongoController {
    
        @Autowired
        private UserService userService;
        
        @GetMapping("/addList")
        @ResponseBody
        public R createList(){
            List<Users> list = new ArrayList<Users>();
            for(int i=20; i<30; i++){
                Users users = new Users(i+"","小明"+i, i);
                users.setAddress("南京市");
                list.add(users);
            }
            userService.saveUsers(list);
            return R.success();
        }
        
        @GetMapping("/add")
        @ResponseBody
        public R create(){
            Users users = new Users("1","小明", 10);
            users.setAddress("南京市");
            userService.saveUser(users);
            return R.success();
        }
        
        @GetMapping("/list")
        @ResponseBody
        public List<Users> list(){
            List<Users> listUser = userService.listUser();
            return listUser;
        }
        
        @GetMapping("/remove/{name}")
        @ResponseBody
        public R remove(@PathVariable String name){
            userService.removeUser(name);
            return R.success();
        }
        
        @GetMapping("/update/{name}")
        @ResponseBody
        public R update(@PathVariable String name){
            userService.updateUser(name, "age", "90");
            return R.success();
        }
    }



    分页:
    以正序为例,假设已经取到了第一页的数据,前端记录下当前这页数据的最大id,然后点击下一页时将这个id带给后端,后端取数据时先根据id比较找到所有id大于这个id的数据,然后limit
  • 相关阅读:
    在一台服务器上搭建相对高可用HiveServer实践
    HDU 4462 Scaring the Birds (暴力求解,二进制法)
    HDU 4461 The Power of Xiangqi (水题)
    HDU 4460 Friend Chains (BFS,最长路径)
    UVaLive 7270 Osu! Master (统计)
    CodeForces 705C Thor (模拟+STL)
    CodeForces 705B Spider Man (水题)
    CodeForces 705A Hulk (水题)
    UVa 11971 Polygon (数学,转化)
    UVa 10900 So you want to be a 2n-aire? (概率DP,数学)
  • 原文地址:https://www.cnblogs.com/lyon91/p/8484173.html
Copyright © 2011-2022 走看看