说明:
文档型数据库,采用BSON格式。介于关系型数据库和非关系型数据库之间,属于NoSQL数据库之一。 适合大数据场景使用,大量数据写入操作。
一个文档==表中的一行数据,(多个文档)集合==(多行数据)表,多个集合(表)组成数据库。
一、Docker中安装MongoDB服务器:
1.创建mongo容器(端口27017):
docker run -di --name=mall_mongo -p 27017:27017 mongo2.连接登录mongo数据库(安装在本机地址为:127.0.0.1):
mongo 192.168.1.1193.退出(>表示已登录):
> 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 collections2.插入数据:
语法: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))); } }