JavaEE:MongoDB安装与使用

    技术2022-07-15  81

    说明:

    文档型数据库,采用BSON格式。介于关系型数据库和非关系型数据库之间,属于NoSQL数据库之一。 适合大数据场景使用,大量数据写入操作。

    一个文档==表中的一行数据,(多个文档)集合==(多行数据)表,多个集合(表)组成数据库。

    一、Docker中安装MongoDB服务器:

    1.创建mongo容器(端口27017):

    docker run -di --name=mall_mongo -p 27017:27017 mongo

    2.连接登录mongo数据库(安装在本机地址为:127.0.0.1):

    mongo 192.168.1.119

    3.退出(>表示已登录):

    > exit

    二、数据类型:

    1.基本数据类型:

    (1)null类型: {"key1": null} (2)布尔类型(true或false): {"key1": false} (3)数值类型: 浮点型(默认): {"key1": 1.0} 4字节整数: {"key1": NumberInt("1")} 8字节整数: {"key1": NumberLong("1")} (4)字符串类型(UTF-8编码): {"key1": "value1"} (5)日期类型: {"key1", new Date()} (6)正则表达式类型(js正则语法): {"key1": /[abcdef]/} (7)数组类型: {"key1": ["value1", "value2"]} (8)内嵌文档类型(类似json): {"key1": {"key2": "value1"}} (9)对象ID类型(自动生成12字节长的字符串):{"_id": ObjectId("xxx...")} (10)二进制类型(任意字符串的字节方式,用于存储非UTF-8类型的字符串)。 (11)js代码类型:{"key1": function(){/.../}}

    三、mongo命令:

    1.创建/显示数据库/表的一些命令:

    #创建或使用数据库,此处数据库名为mydb > use mydb #显示数据库列表 > show dbs #显示当前数据库 > db #创建表,此处表名为user > db.createCollection("user") #显示所有表 > show collections

    2.插入数据:

    语法:db.表名.insert({列名1: 值1, 列名2: 值1})

    > db.user.insert({_id: "0", name: "先生1", age: 18})

    3.查询数据(没有表时自动创建):

    语法:db.表名.find({查询条件})

    (1)查全部:

    > db.user.find()

    (2)按条件查(name=先生1):

    > db.user.find({name: "先生1"})

    (3)查第1条:

    > db.user.findOne()

    (4)查前面N条(skip为跳过几条,limit为取几条):

    > db.user.find().skip(0).limit(10)

    (5)模糊查询(语法:/要匹配的字符串/):

    #匹配所有name列带"先"的 > db.user.find({name: /先/}) #匹配name列以"先"开头的 > db.user.find({name: /^先/})

    (6)比较操作符(<、<=、>、>=):

    #age>18 > db.user.find({age: {$gt: 18}}) #age>=18 > db.user.find({age: {$gte: 18}}) #age<18 > db.user.find({age: {$lt: 18}}) #age<=18 > db.user.find({age: {$lte: 18}}) #age!=18 > db.user.find({age: {$ne: 18}})

    (7)包含/不包含:

    #name包含多个值: > db.user.find({name: {$in: ["先生1", "先生2"]}}) #name不含这些值: > db.user.find({name: {$nin: ["先生1", "先生2"]}})

    (8)条件连接(同时满足多个条件):

    #逻辑与:$and: [{条件1}, {条件2}, ...] > db.user.find({$and: [{name: "先生1"}, {name: "先生2"}]}) #逻辑或:$or: [{条件1}, {条件2}, ...] > db.user.find({$or: [{name: "先生1"}, {name: "先生2"}]})

    4.修改数据:

    (1)语法:db.表名.update({查询条件}, {$set: {新数据}})

    > db.user.update({_id: "0"}, {$set: {name: "先生2"}})

    (2)列值增长(将原有列数值增加指定值):

    语法:db.表名.update({查询条件}, {$inc: {列名: 要增加的值}})

    > db.user.update({_id: "0"}, {$inc: {age: 1}})

    5.删除数据:

    语法:db.表名.remove({条件})

    (1)删全部:

    > db.user.remove({})

    (2)按条件删:

    > db.user.remove({_id: "0"})

    6.统计条数:

    语法:db.表名.count({条件})

    > db.user.count({name: "先生"})

    四、用MongoDB-Api操作MongoDB数据:

    1.导入MongoDB驱动包:

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

    2.增删改查(Dao类要加上@Component被扫描创建实例):

    连接/关闭:

    //获取表操作对象 private MongoCollection<Document> getTableObject() {     //建立数据库连接     mClient = new MongoClient("192.168.3.119");     //获取mydb数据库操作对象     MongoDatabase db = mClient.getDatabase("mydb");     //获取User表操作对象     MongoCollection<Document> table = db.getCollection("user");     return table; } //关闭连接 private void close() {     if (mClient != null) {         //关闭连接         mClient.close();         mClient = null;     } }

    (1)插入数据:

    //插入数据 public void insert(User user) {     //1.获取User表操作对象     MongoCollection<Document> table = getTableObject();     //2.创建数据     Map<String, Object> map = new HashMap<String, Object>();     map.put("_id", user.getId());     map.put("name", user.getName());     map.put("age", user.getAge());     //3.创建一条文档记录     Document item = new Document(map);     //4.执行插入操作     table.insertOne(item);     //4.table.insertMany(null);  //插入多个     //5.关闭连接     close(); }

    (2)删除数据:

    //删除数据 public void delete(String id) {     //1.获取User表操作对象     MongoCollection<Document> table = getTableObject();     //2.创建条件     BsonDocument bson = new BsonDocument();     bson.put("_id", new BsonString(id)); //BsonInt32为int,BsonBoolean为boolean     //3.执行删除     table.deleteOne(bson);     //4.关闭连接     close(); }

    (3)更新数据:

    //更新数据 public void update(User user) { //1.获取User表操作对象 MongoCollection<Document> table = getTableObject(); //2.创建新数据 Map<String, Object> newData = new HashMap<>(); newData.put("name", user.getName()); newData.put("age", user.getAge()); //3.执行更新,第1个参数Filters.eq为条件,第2个参数为新数据,$set表示设值 table.updateMany(Filters.eq("_id", user.getId()), new Document("$set", newData)); //4.关闭连接 close(); }

    (4)查询数据:

    //查询全部 public List<User> findAll() {     List<User> users = new ArrayList<User>();     //1.获取User表操作对象     MongoCollection<Document> table = getTableObject();     //2.查询所有     FindIterable<Document> result = table.find();     if (result == null) {         return users;     }     //3.取出数据     for (Document item : result) {         /*         item.getString("key1");  //取String类型的值         item.getInteger("key1"); //取int类型         item.getDouble("key1");  //取double类型         item.getBoolean("key1");  //取boolean类型         item.getDate("key1");    //取Date类型         item.getLong("key1");    //取long类型         */         users.add(new User(item.getString("_id"), item.getString("name"), item.getInteger("age")));     }     //4.关闭连接     close();     return users; } //按条件查询 public List<User> query(String id, String name, int age) {     List<User> users = new ArrayList<User>();     //1.获取User表操作对象     MongoCollection<Document> table = getTableObject();     //2.建立条件对象     //条件:_id = 0     BasicDBObject where1 = new BasicDBObject("_id", "0");     //条件:age >= 18     BasicDBObject where2 = new BasicDBObject("age", new BasicDBObject("$gte", 18));     //模糊查询:name中有"先生"字的 BasicDBObject where3 = new BasicDBObject("name", new BasicDBObject("$regex", "先生"));     //3.执行查询     FindIterable<Document> result = table.find(where1);     if (result == null) {         return users;     }     //4.取出查询结果     for (Document item : result) {         users.add(new User(item.getString("_id"), item.getString("name"), item.getInteger("age")));     }     //5.关闭连接     return users; }

    五、SpringData-MongoDB使用:

    1.导入SpringData-MongoDB依赖包:

    <dependencies>     <!-- 导入SpringData-MongoDB依赖包 -->     <dependency>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-data-mongodb</artifactId>     </dependency> </dependencies>

    2.创建application.yml,配置mongodb服务器地址与数据库名:

    server:   port: 10003  #本微服务端口 spring:   application:     name: mall-mongodb   #本微服务名称   data:     mongodb:       host: 192.168.3.119  #mongodb服务器地址       database: mydb   #数据库名称

    3.创建实体类:

    @Document(collection = "user") //映射表的名字 public class User implements Serializable {     @Id  //数据库_id     private String _id;     private String name;     private int age;     public String get_id() {         return _id;     }     public void set_id(String _id) {         this._id = _id;     }     public String getName() {         return name;     }     public void setName(String name) {         this.name = name;     }     public int getAge() {         return age;     }     public void setAge(int age) {         this.age = age;     } }

    4.创建Dao接口类(SpringData-MongoDB数据操作类):

    //SpringData-MongoDB数据操作类 @Component public interface UserDao extends MongoRepository<User, String> { //dao需要继承MongoRepository }

    5.调用Dao实现类进行增删改查操作:

    @Transactional  //开启事务 @Service  //标识此类为业务层类(service层) public class UserBiz {//操作Dao的业务类     @Autowired     private UserDao userDao; //dao操作类     @Autowired     private MongoTemplate mongoTemplate; //MongoDB原生API操作类     //插入数据     public void insert(User user) {         userDao.insert(user);     }     //删除数据     public void delete(String id) {         userDao.deleteById(id);     }     //更新数据     public void update(User user) {         userDao.save(user);     }     //使用MongoTemplate更新数据     public void updateByTemplate(User user) {         //1.增加查询条件:_id=xxx         Query q = new Query();         q.addCriteria(Criteria.where("_id").is(user.get_id()));         //2.设置新数据         Update u = new Update();         u.set("name", user.getName());         u.set("age", user.getAge());         //3.执行更新         mongoTemplate.updateFirst(q, u, "user");     }     //查询全部     public List<User> findAll() {         return userDao.findAll();     }     //按条件查询单个     public User findById(String id) {         return userDao.findById(id).get();     }     //分页查询     public List<User> queryPage(int pageIndex, int pageSize) {//pageIndex页码从0开始,pageSize一页多少条         Pageable pageable = PageRequest.of(pageIndex, pageSize);  //创建分页条件         return userDao.queryPage(pageable).getContent(); //分页查询     } }

    六、SpringData-MongoDB-GridFs使用:

    说明:GridFS是MongoDB提供的用于存储文件的功能,文件会按256KB的大小分割成多块存储。

    1.配置config类:

    @Configuration public class GridfsConfig { @Value("${spring.data.mongodb.database}") //获取application.yml中的数据库名称 private String dbName; @Bean public GridFSBucket getGridFSBucket(MongoClient mongoClient) { MongoDatabase db = mongoClient.getDatabase(dbName); GridFSBucket b = GridFSBuckets.create(db); return b; } }

    2.文件存/取/删:

    public class GridfsBiz { @Autowired GridFsTemplate gridFsTemplate; @Autowired GridFSBucket gridFSBucket; //保存文件到gridfs public String saveFile(String path) { try { File file = new File(path); FileInputStream in = new FileInputStream(file); ObjectId fileID = gridFsTemplate.store(in, "文件名", "内容类别"); //将文件存入GridFS if (fileID != null) { return fileID.toString(); } } catch (Exception e) { e.printStackTrace(); } return null; } //获取文件流 public InputStream findFile(String fileID) { try { GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileID))); GridFSDownloadStream ds = gridFSBucket.openDownloadStream(gridFSFile.getObjectId()); GridFsResource resource = new GridFsResource(gridFSFile, ds); return resource.getInputStream(); } catch (Exception e) { e.printStackTrace(); } return null; } //删除文件 public void deleteFile(String fileID) { gridFsTemplate.delete(Query.query(Criteria.where("_id").is(fileID))); } }

     

    Processed: 0.009, SQL: 9