MongoDB

通过MongoTemplate完成CRUD操作

所对应的实体类
@Document(value="person")
public class Person {

    private ObjectId id;
    private String name;
    private int age;
    private String address;
    
}

  @Autowired
    private MongoTemplate mongoTemplate;


    //保存
    @Test
    public void testSave() {
        Person person = new Person();
        person.setName("张三");
        person.setAge(18);
        person.setAddress("北京金燕龙");
        mongoTemplate.save(person);
    }

    //保存
    @Test
    public void testSave2() {
        for (int i = 0; i < 10; i++) {
            Person person = new Person();
            person.setId(ObjectId.get()); //ObjectId.get():获取一个唯一主键字符串
            person.setName("张三"+i);
            person.setAddress("金燕龙"+i);
            person.setAge(18+i);
            mongoTemplate.save(person);
        }
    }

    /**
     * 查询所有
     */
    @Test
    public void testFindAll() {
        List list = mongoTemplate.findAll(Person.class);
        for (Person person : list) {
            System.out.println(person);
        }
    }

    /**
     * 条件查询
     */
    @Test
    public void testFind() {
        //1、创建Criteria对象,并设置查询条件
        Criteria criteria = Criteria.where("myname").is("张三")
                .and("age").is(18)
                ;//is 相当于sql语句中的=
        //2、根据Criteria创建Query
        Query query = new Query(criteria);
        //3、查询
        List list = mongoTemplate.find(query, Person.class);//Query对象,实体类对象字节码
        for (Person person : list) {
            System.out.println(person);
        }
    }

    /**
     * 分页查询
     */
    @Test
    public void testPage() {
        int page = 1;
        int size = 2;
        //1、创建Criteria对象,并设置查询条件
        Criteria criteria = Criteria.where("age").lt(50); //is 相当于sql语句中的=
        //2、根据Criteria创建Query
        Query queryLimit = new Query(criteria)
                .skip((page -1) * size) //从第几条开始查询
                .limit(size) //每页查询条数
                .with(Sort.by(Sort.Order.desc("age")));
        //3、查询
        List list = mongoTemplate.find(queryLimit, Person.class);
        for (Person person : list) {
            System.out.println(person);
        }
    }


    /**
     * 更新
     */
    @Test
    public void testUpdate() {
        //1、构建Query对象
        Query query = Query.query(Criteria.where("id").is("61275c3980f68e67ab4fdf25"));
        //2、设置需要更新的数据内容
        Update update = new Update();
        update.set("age", 10);
        update.set("myname", "lisi");
        //3、调用方法
        mongoTemplate.updateFirst(query, update, Person.class);
    }


update.inc(key,1)给某个字段加一
mongoTemplate.exists(query,Comment.class)

    //删除
    @Test
    public void testDelete() {
        //1、构建Query对象
        Query query = Query.query(Criteria.where("id").is("5fe404c26a787e3b50d8d5ad"));
        mongoTemplate.remove(query, Person.class);
    }


副本集群
对于中小型项目,使用副本集群就够了。
一个主,两个从库组成,主库宕机时,这两个从库都可以被选为主库。
当主库宕机后,两个从库都会进行竞选,其中一个变为主库,当原主库恢复后,作为从库加入当前的复制集群即可。
Master:代表主节点,主节点提供所有数据的CRUD服务
Backup:代表从节点,从节点不提供任何服务
Arbitration:代表仲裁节点,仲裁节点不存储任何数据,其主要作用就是当主节点挂掉以后,把那个备份节点提升为一个主节点。
secondary: 从节点, 提供只读服务


分片集群
高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。

为了解决这些问题,有两个基本的方法: 垂直扩展和水平扩展。
垂直扩展:增加更多的CPU和存储资源来扩展容量。
水平扩展:将数据集分布在多个服务器上。水平扩展即分片。

例如,如果数据库1tb的数据集,并有4个分片,然后每个分片可能仅持有256 GB的数据。如果有40个分片,那么每个切分可能只有25GB的数据。


分片策略
范围指定:将指定字段数据按照范围进行划分,根据范围获取分片服务器

数据hash:将指定字段的数据进行hash计算,获取存储的分片服务器

你可能感兴趣的:(mongodb,数据库,java)