MongoDB学习笔记(二)

一、添加MongoDB可视化工具(MongoDB Compass)

  • 添加链接
    在这里插入图片描述
    在这里插入图片描述
  • 创建、删除数据库

进入页面之后,点击CREATE DATABASE,创建数据库。

在这里插入图片描述

例如:创建数据库test,并且创建一个集合users,如下:
在这里插入图片描述
然后点击CREATE DATABASE后,数据库test就建立了。

  • 删除数据库
    在这里插入图片描述
    选中左侧test数据库,会出现增加数据库集合、删除数据库两个按钮,选择删除按钮。

  • 其他功能介绍

1、Explain Plan

在MongoDB shell中有explain()函数,用于检测诊察数据的运行情况, Explain Plan也具有相同的功能,评估查询的性能,

一般应用在find()函数查询中,评估索引等。
在这里插入图片描述

2、Indexes

在Indexes中,可以观测出相对应的集合的索引情况,也可以创建索引,其中索引“id”是系统中规定的唯一索引,不可删除。

其他建立的索引可以进行增删改查。

在这里插入图片描述
二、JAVA相关API

1、jar包依赖

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver</artifactId>
    <version>3.6.1</version>
</dependency>

2、插入

  @Test
  public void testInsert(){

      MongoClient mongoClient = new MongoClient("127.0.0.1", 27017);

      // 获取指定数据库
      MongoDatabase database = mongoClient.getDatabase("test");

      // 获取指定集合
      MongoCollection<Document> collection = database.getCollection("users");

      // 创建需要插入的单个文档
      Document doc = new Document("name", "MongoDB")
              .append("type", "database")
              .append("count", 1)
              .append("versions", Arrays.asList("v3.2", "v3.0", "v2.6"))
              .append("info", new Document("x", 203).append("y", 102));

      // 测试插入
      collection.insertOne(doc);

      // 测试插入多个文档
      ArrayList<Document> documents = new ArrayList<Document>();
      for (int i = 0; i < 100; i++) {
           documents.add(new Document("i",i));
      }

      collection.insertMany(documents);
      mongoClient.close();
  }

在这里插入图片描述

3、修改

  @Test
  public void test3(){
      MongoClient mongoClient = new MongoClient("127.0.0.1", 27017);

      // 获取指定数据库
      MongoDatabase database = mongoClient.getDatabase("test");

      // 获取指定集合
      MongoCollection<Document> collection = database.getCollection("users");

      // update t_user set i = 110 where i = 10
      //UpdateResult updateResult = collection.updateOne(new Document("i", 10), new Document("$set", new Document("i", 110)));

      // update t_user set i =10 where i < 20
      // lt(key,value)  静态导入  import static com.mongodb.client.model.Filters.lt;
      collection.updateMany(lt("i",20),new Document("$set",new Document("i",10).append("test","test value")));

      mongoClient.close();
  }

在这里插入图片描述

4、删除

  @Test
  public void test4(){
      MongoClient mongoClient = new MongoClient("127.0.0.1", 27017);

      // 获取指定数据库
      MongoDatabase database = mongoClient.getDatabase("test");

      // 获取指定集合
      MongoCollection<Document> collection = database.getCollection("users");

      DeleteResult deleteResult = null;

      //deleteResult =collection.deleteOne(eq("i", 110));

      deleteResult = collection.deleteMany(lt("i", 20));

      System.out.println("删除的文档数:"+deleteResult.getDeletedCount());

      mongoClient.close();
  }

5、查询

  @Test
  public void test5(){
      MongoClient mongoClient = new MongoClient("127.0.0.1", 27017);

      // 获取指定数据库
      MongoDatabase database = mongoClient.getDatabase("test");

      // 获取指定集合
      MongoCollection<Document> collection = database.getCollection("users");

      // 查所有
      FindIterable<Document> documents = null;

      documents = collection.find();

      // 条件查询 select * fromt t_user where i = 20
      documents = collection.find(eq("i",20));

      // select * from t_user where i <= 20
      documents = collection.find(lte("i",30));

      // select * from t_user where i = 30 or i = 40 or i = 50
      documents = collection.find(in("i",30,40,50));

      // SELECT * FROM t_user WHERE i = 50 OR i < 25
      documents = collection.find(or(new Document("i",50),lt("i",25)));

      // 模糊查询 参数二:模糊条件
      documents = collection.find(regex("test","test"));

      // 排序 SELECT * FROM t_user WHERE i >= 90 order by i desc
      documents = collection.find(gt("i",90)).sort(Sorts.descending("i"));

      // 分页查询
      documents = collection.find().skip(50).limit(10);

      for (Document document : documents) {
          System.out.println(document);
      }

      mongoClient.close();
  }

三、SpringBoot集成MongoDB

因为我们每次在使用MongoDB时,每次都需要手动的去开启连接,关闭连接,这样在使用的时候就感觉很麻烦并且不友好,每次都需要关心连接问题,所以我们在后续的时候把MongoDB连接配置问题直接交给Spring去管理,我们只需要关注与业务发展就行,这样也大力的解放了开发难度。

1、POM配置

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

在这里插入图片描述
2、基础配置application.yml(application.properties):
在这里插入图片描述

3、注解说明
@Document
标注在实体类上,与hibernate异曲同工。

@Document(collection=“users”)
public class User 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;

@Field
代表一个字段,可以不加,不加的话默认以参数名为列名。

@Field(“firstName”)
private String name;

  • 例如:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "users")
public class User implements Serializable {

    private static final long serialVersionUID = -1369148652554782331L;
    @Id
    private String uid;
    private String name;
    private Integer age;
    private String address;
}
import com.example.demo.entity.User;

import java.util.List;

public interface UserService {

    void saveUser(User user);

    User findUserById(String id);

    List<User> findAllUsers();

    void deleteUser(User user);

    void updateUser(User user);
}
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Collation;
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 java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public void saveUser(User user) {
        mongoTemplate.save(user);
    }

    @Override
    public User findUserById(String id) {
        Query query = new Query(Criteria.where("_id").is(id));
        User user = mongoTemplate.findOne(query, User.class);
        return user;
    }

    @Override
    public List<User> findAllUsers() {
        List<User> list = mongoTemplate.findAll(User.class);
        return list;
    }

    @Override
    public void deleteUser(User user) {
        mongoTemplate.remove(user);
    }

    @Override
    public void updateUser(User user) {
        Query query = new Query(Criteria.where("_id").is(user.getUid()));

        Update update = new Update();
        if (!StringUtils.isBlank(user.getName())) {
            update.set("name", user.getName());
        }
        if (null != user.getAge()) {
            update.set("age", user.getAge());
        }
        if (!StringUtils.isBlank(user.getAddress())) {
            update.set("address", user.getAddress());
        }

        mongoTemplate.updateFirst(query, update, User.class);

    }
}
  • 保存
        //保存
        User user = new User();
        //当需要自定义id主键时就设置对象id
        //user.setUid(UUID.randomUUID().toString());
        user.setName("张三");
        user.setAge(11);
        user.setAddress("北京");
        userService.saveUser(user);

在这里插入图片描述

  • 删除
//删除 by id
User user = new User();
user.setUid("5eedee10a374a970719351df");
userService.deleteUser(user);
  • 更新
User user = new User();
user.setUid("5eedeeeb0485b0672c619b3a");
user.setAge(20);
userService.updateUser(user);

在这里插入图片描述

  • 查询
        Query query = new Query();
        //查全部
        Criteria criteria = Criteria.where("age").gte(1);
//        //条件查询
//        Query query = new Query(Criteria.where("age").gte(10));
//        //模糊查询
//        Query query = new Query(Criteria.where("address").regex("京"));
//        //排序
//        query.with(Sort.by(Sort.Order.desc("age")));
        //分页
        //设置起始数 (currentPage - 1) * pageSize
        query.skip(0);
        //设置每页查询条数pageSize
        query.limit(2);
        query.with(Sort.by(Sort.Order.desc("age")));
        List<User> list = mongoTemplate.find(query, User.class);
        // 查询记录总数
        int count = (int) mongoTemplate.count(query, User.class);
        // 数据总页数
        //int totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;

        list.forEach( u -> System.out.println(u));
  • 批量保存
     //批量操作
//        BulkOperations.BulkMode.UNORDERED 和 BulkOperations.BulkMode.ORDERED的区别:
//        UNORDERED是平行处理,即使某条记录出错了,其余的也会继续处理;
//        ORDERED是队列排序处理,只要中途有个失败了,那么后续的操作流程就会终止了。
        //插入
        List<User> list = Arrays.asList(
                new User("", "赵六", 20, "武汉"),
                new User("", "凌达", 18, "上海")
        );
        //方式一
        //mongoTemplate.insert(list, User.class);
        //方式二
        BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "users");
        operations.insert(list);
        BulkWriteResult result = operations.execute();
  • 批量更新
//先查询符合条件的数据,然后将符合条件的数据批量更新
Criteria cc = Criteria.where("visitRoomNum").is(passengerInfo.getRoomCode())
                .and("visitName").is(passengerInfo.getName()).and("hotelUid").is(passengerInfo.getHotelUid());
 Query qu = new Query(cc);
 log.info("qu:" + qu);
 List<PassengerInfo> list = mongoTemplate.find(qu, PassengerInfo.class);
 Update u = new Update();
 u.set("orderNum", passengerInfo.getOrderNum()).set("visitRoomNum", changRoomDTO.getRoomCode());
 BulkOperations ops = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, PassengerInfo.class);
 BulkOperations bulkOperations = ops.updateMulti(qu, u);
 BulkWriteResult execute = bulkOperations.execute();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值