关于建设学校网站的报告书,上海倒闭工厂名单,图片滤镜网站开发,怎么制作公众号长图MongoDB是一个基于分布式#xff08;海量数据存储#xff09;文件存储的数据库。
MongoDB是一个介于关系数据库和非关系数据库之间的产品#xff0c;是非关系数据库当中功能最丰富#xff0c;最像关系数据库的#xff0c;它支持的数据结构非常松散#xff0c;是类似json…MongoDB是一个基于分布式海量数据存储文件存储的数据库。
MongoDB是一个介于关系数据库和非关系数据库之间的产品是非关系数据库当中功能最丰富最像关系数据库的它支持的数据结构非常松散是类似json的bson格式因此可以存储比较复杂的数据类型。
实现类似关系数据库单表查询的绝大部分功能而且还支持对数据建立索引。
官网https://www.mongodb.com/ MongoDB
简介基本使用JavaAPISpringBoot整合 MongoDB
基本概念
SQL术语MongoDB术语解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引table joins表连接,MongoDB不支持primary keyprimary key主键,MongoDB自动将_id字段设置为主键
命令行操作
docker安装MongoDB
#拉取镜像
docker pull mongo#创建容器
docker create --name mongodb -p 27017:27017 -v /data/mongodb-data:/data/db mongo#启动容器
docker start mongodb#进入容器
docker exec -it mongodb /bin/bash
#使用MongoDB客户端进行操作
mongo#查询所有的数据库
show dbs表操作
#查看所有的数据库show dbs
admin 0.000GB
config 0.000GB
local 0.000GB#通过use关键字切换数据库use admin
switched to db admin#创建数据库
#说明在MongoDB中数据库是自动创建的通过use切换到新数据库中进行插入数据即可自动创建数据库use testdb #并没有创建数据库
switched to db testdbshow dbs
admin 0.000GB
config 0.000GB
local 0.000GB db.user.insert({id:1,name:zhangsan}) #插入数据
WriteResult({ nInserted : 1 })show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
testdb 0.000GB #数据库自动创建#查看表show tables
usershow collections
user#删除集合表db.user.drop()
true #如果成功删除选定集合则 drop() 方法返回 true否则返回 false。#删除数据库use testdb #先切换到要删除的数据中
switched to db testdb db.dropDatabase() #删除数据库
{ dropped : testdb, ok : 1 }show dbs
admin 0.000GB
config 0.000GB
local 0.000G新增数据
在MongoDB中存储的文档结构是一种类似于json的结构称之为bson全称为Binary JSON 语法db.COLLECTION_NAME.insert(document) db.user.insert({id:1,username:zhangsan,age:20})
WriteResult({ nInserted : 1 })db.user.save({id:2,username:lisi,age:25})
WriteResult({ nInserted : 1 }) db.user.find() #查询数据
{ _id : ObjectId(5c08c0024b318926e0c1f6dc), id : 1, username : zhangsan,
age : 20 }
{ _id : ObjectId(5c08c0134b318926e0c1f6dd), id : 2, username : lisi,
age : 25 }查询数据 db.user.find([query],[fields]) query 可选使用查询操作符指定查询条件 fields 可选使用投影操作符指定返回的键。查询时返回文档中所有键值 只需省略该参数即可默认省略 db.col.find().pretty() 以格式化的方式来显示所有文档 含义格式范例等于{\key:\value }db.col.find({“by”:“黑马程序员”}).pretty()小于{key:{$lt: value}} db.col.find({“likes”: {$lt:50}}).pretty()小于或 等于{key:{$lte: value}} db.col.find({“likes”: {$lte:50}}).pretty()大于{key:{$gt: value}}db.col.find({“likes”: {$gt:50}}).pretty()大于或 等于{key:{$gte: value}}db.col.find({“likes”: {$gte:50}}).pretty()不等于{key:{$ne: value}}db.col.find({“likes”: {$ne:50}}).pretty()
#查询全部数据
db.user.find() #只查询id与username字段
db.user.find({},{id:1,username:1})#查询数据条数
db.user.find().count() #查询id为1的数据
db.user.find({id:1}) #查询小于等于21的数据
db.user.find({age:{$lte:21}})#and查询age小于等于21并且id大于等于2
db.user.find({age:{$lte:21}, id:{$gte:2}})#查询id1 or id2
db.user.find({$or:[{id:1},{id:2}]}) #分页查询Skip()跳过几条limit()查询条数
db.user.find().limit(2).skip(1) #跳过1条数据查询2条数据db.user.find().sort({id:-1}) #按照age倒序排序-1为倒序1为正序更新数据
update() 方法用于更新已存在的文档
db.collection.update(query,update,[upsert: boolean,multi: boolean,writeConcern: document]
) query : update的查询条件update : update的对象和一些更新的操作符如 inc…等upsert : 可选这个参数的意思是如果不存在update的记录是否插入objNew,true为插入默认是false不插入。multi : 可选mongodb 默认是false,只更新找到的第一条记录如果这个参数为true,就把按条件查出来多条 记录全部更新。writeConcern :可选抛出异常的级别 db.user.update({id:1},{$set:{age:22}}) #更新数据
WriteResult({ nMatched : 1, nUpserted : 0, nModified : 1 })
WriteResult({ nMatched : 1, nUpserted : 0, nModified : 1 })nMatched数据匹配数量nUpserted匹配不存在时更新数量nModified修改数量
#注意如果这样写会删除掉其他的字段db.user.update({id:1},{age:25})
WriteResult({ nMatched : 1, nUpserted : 0, nModified : 1 }) db.user.find()
{ _id : ObjectId(5c08c0024b318926e0c1f6dc), age : 25 }
{ _id : ObjectId(5c08c0134b318926e0c1f6dd), id : 2, username : lisi,
age : 25 }#更新不存在的字段会新增字段db.user.update({id:2},{$set:{sex:1}}) #更新数据db.user.find()
{ _id : ObjectId(5c08c0024b318926e0c1f6dc), age : 25 }
{ _id : ObjectId(5c08c0134b318926e0c1f6dd), id : 2, username : lisi,
age : 25, sex : 1 }#更新不存在的数据默认不会新增数据db.user.update({id:3},{$set:{sex:1}})
WriteResult({ nMatched : 0, nUpserted : 0, nModified : 0 }) db.user.find()
{ _id : ObjectId(5c08c0024b318926e0c1f6dc), age : 25 }
{ _id : ObjectId(5c08c0134b318926e0c1f6dd), id : 2, username : lisi,
age : 25, sex : 1 }#如果设置第一个参数为true就是新增数据db.user.update({id:3},{$set:{sex:1}},true)
WriteResult({
nMatched : 0,
nUpserted : 1,
nModified : 0,
_id : ObjectId(5c08cb281418d073246bc642)
})删除数据
db.collection.remove(query,{justOne: boolean,writeConcern: document}
) query :可选删除的文档的条件。justOne : 可选如果设为 true 或 1则只删除一个文档如果不设置该参数或使用默认值 false则删除所有匹配条件的文档。writeConcern :可选抛出异常的级别。 db.user.remove({age:25})
WriteResult({ nRemoved : 2 }) #删除了2条数据#插入4条测试数据
db.user.insert({id:1,username:zhangsan,age:20})
db.user.insert({id:2,username:lisi,age:21})
db.user.insert({id:3,username:wangwu,age:22})
db.user.insert({id:4,username:zhaoliu,age:22}) db.user.remove({age:22},true)
WriteResult({ nRemoved : 1 }) #删除了1条数据#删除所有数据db.user.remove({})#说明为了简化操作官方推荐使用deleteOne()与deleteMany()进行删除数据操作。
db.user.deleteOne({id:1})
db.user.deleteMany({}) #删除所有数据索引
MongoDB在读取数据时必须扫描集合中的每个文件并选取 那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的特别在处理大量的数据时查询可以要花费几十秒甚至几分钟这对网站的性能是非常致命的。
索引是特殊的数据结构索引存储在一个易于遍历读取的数据集合中索引是对数据库表中一列或多列的值进行排序的一种结构 索引通常能够极大的提高查询的效率
查看索引
#查看索引db.user.getIndexes()
[{v : 2,#索引版本key : {#索引字段_id : 1 #正序还是倒序},name : _id_,#索引名ns : testdb.user #命名空间}
]
#说明1表示升序创建索引-1表示降序创建索引创建索引
#创建索引db.user.createIndex({age:1})
{createdCollectionAutomatically : false,numIndexesBefore : 1,numIndexesAfter : 2,ok : 1
}删除索引
#删除索引
db.user.dropIndex(age_1)
#或者删除除了_id之外的索引
db.user.dropIndexes()创建联合索引
#创建联合索引
db.user.createIndex({age:1, id:-1})查看索引大小
#查看索引大小单位字节
db.user.totalIndexSize()执行详情
MongoDB 查询分析可以确保我们建议的索引是否有效是查询语句性能分析的重要工具
MongoDB内部使用的是JS引擎编写JS脚本执行循环语句
#插入1000条数据
for(var i1;i1000;i)db.users.insert({id:100i,username:name_i,age:10i})#查看执行计划db.user.find({age:{$gt:100},id:{$lt:200}}).explain(){queryPlanner : {plannerVersion : 1,namespace : testdb.user,indexFilterSet : false,parsedQuery : {$and : [{id : {$lt : 200}},{age : {$gt : 100}}]},winningPlan : { #最佳执行计划stage : FETCH, #查询方式
#COLLSCAN/全表扫描 IXSCAN/索引扫描 FETCH/根据索引去检索文档 SHARD_MERGE/合并分片结果 IDHACK/针对_id进行查询inputStage : {stage : IXSCAN,keyPattern : {age : 1,id : -1},indexName : age_1_id_-1,isMultiKey : false,multiKeyPaths : {age : [ ],id : [ ]},isUnique : false,isSparse : false,isPartial : false,indexVersion : 2,direction : forward,indexBounds : {age : [(100.0, inf.0]],id : [(200.0, -inf.0]]}}},rejectedPlans : [ ]},serverInfo : {host : c493d5ff750a,port : 27017,version : 4.0.3,gitVersion : 7ea530946fa7880364d88c8d8b6026bbc9ffa48c},ok : 1
}GUI——robo 3T
通过javaApi操作
创建工程
com-mongodb
com-mongodb
pom.xml
dependenciesdependencygroupIdorg.mongodb/groupIdartifactIdmongodb-driver-sync/artifactIdversion3.9.1/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.4/version/dependency
/dependenciesbuildplugins!-- java编译插件 --plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.2/versionconfigurationsource1.8/sourcetarget1.8/targetencodingUTF-8/encoding/configuration/plugin/plugins
/buildDemo
如何连接到MongoDB如何选择数据库、表进行查询的操作
package com.mongodb;import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;public class MongodbDemo {public static void main(String[] args) {//建立连接MongoClient mongoClient MongoClients.create(mongodb://8.140.130.91:27017);//选择数据库MongoDatabase mongoDatabase mongoClient.getDatabase(testdb);//选择表MongoCollectionDocument userCollection mongoDatabase.getCollection(user);//查询表for (Document document : userCollection.find().limit(10)) {System.out.println(document.toJson());}mongoClient.close();}
}CRUD操作
初始化建立连接
package com.mongodb;import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import org.junit.Before;
import org.junit.Test;public class TestCRUD {private MongoCollectionDocument mongoCollection;Beforepublic void init(){//建立连接MongoClient mongoClient MongoClients.create(mongodb://8.140.130.91:27017);//选择数据库MongoDatabase mongoDatabase mongoClient.getDatabase(testdb);//选择表this.mongoCollection mongoDatabase.getCollection(users);}
}查询
组合查询
// 复杂查询age50并且id100的用户信息并且按照id倒序排序只返回idage字段不返回_id字段
Test
public void testQuery(){for (Document document : this.mongoCollection.find(Filters.and(Filters.lte(age,50),Filters.gte(id,100)))) {System.out.println(document);}
}排序
// 复杂查询age50并且id100的用户信息并且按照id倒序排序只返回idage字段不返回_id字段
Test
public void testQuery(){for (Document document : this.mongoCollection.find(Filters.and(Filters.lte(age,50),Filters.gte(id,100))).sort(Sorts.descending(id))//降序) {System.out.println(document);}
}指定属性
// 复杂查询age50并且id100的用户信息并且按照id倒序排序只返回idage字段不返回_id字段
Test
public void testQuery(){for (Document document : this.mongoCollection.find(Filters.and(Filters.lte(age,50),Filters.gte(id,100))).sort(Sorts.descending(id))//降序.projection(Projections.fields(Projections.include(id,age),Projections.excludeId()//排除ObjectID))) {System.out.println(document);}
}新增数据
Test
public void testInsert(){Document document new Document(id,10002).append(name, 张三).append(age, 30);this.mongoCollection.insertOne(document);System.out.println(插入数据);for (Document document1 : this.mongoCollection.find(Filters.eq(id,10002))) {System.out.println(document1.toJson());}
}测试删除
Test
public void testDelete(){DeleteResult result this.mongoCollection.deleteOne(Filters.eq(id,10002));System.out.println(result);
}测试更新
Test
public void testUpdate(){UpdateResult result this.mongoCollection.updateOne(Filters.eq(id,10001), Updates.set(age,25));System.out.println(result);for (Document doc : this.mongoCollection.find(Filters.eq(id, 10001))) {System.out.println(doc.toJson());}
}面向对象操作
前面对MongoDB的操作都是基于Document对象操作操作略显繁琐
创建Person、Address
Data
AllArgsConstructor
NoArgsConstructor
public class Person {private ObjectId id;private String name;private int age;private Address address;
}Data
AllArgsConstructor
NoArgsConstructor
public class Address {private String street;private String city;private String zip;
}建立连接
MongoCollectionPerson personCollection;Before
public void init(){//定义对象的解码注册器CodecRegistry pojoCodecRegistry CodecRegistries.fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build()));//建立连接MongoClient mongoClient MongoClients.create(mongodb://8.140.130.91:27017);//选择数据库 并且 注册解码器MongoDatabase mongoDatabase mongoClient.getDatabase(testdb).withCodecRegistry(pojoCodecRegistry);//选择表this.personCollection mongoDatabase.getCollection(person,Person.class);
}新增一条数据
Test
public void testInsert(){Person person new Person(ObjectId.get(), 张三, 20,new Address(人民路, 上海市, 666666));this.personCollection.insertOne(person);System.out.println(插入数据成功);System.out.println();for (Person person1 : this.personCollection.find(Filters.eq(name, 张三))) {System.out.println(person1);}
}新增很多数据
Test
public void testInserts() {ListPerson personList Arrays.asList(new Person(ObjectId.get(), 张三, 20, new Address(人民路, 上海市, 666666)),new Person(ObjectId.get(), 李四, 21, new Address(北京西路, 上海市, 666666)),new Person(ObjectId.get(), 王五, 22, new Address(南京东路, 上海市, 666666)),new Person(ObjectId.get(), 赵六, 23, new Address(陕西南路, 上海市, 666666)),new Person(ObjectId.get(), 孙七, 24, new Address(南京西路, 上海市, 666666)));this.personCollection.insertMany(personList);System.out.println(插入数据成功);System.out.println();testQuery();
}删除单条数据
Test
public void testDelete(){DeleteResult result this.personCollection.deleteOne(Filters.eq(name,张三));System.out.println(result);
}SpringBoot整合MongoDB
spring-data对MongoDB做了支持使用spring-data-mongodb可以简化MongoDB的操作
https://spring.io/projects/spring-data-mongodb
导入依赖
parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.4.3/version
/parentdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-mongodb/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope
/dependency配置文件
# Spring boot application
spring.application.name example-mongodb
spring.data.mongodb.urimongodb://8.140.130.91:27017/testdbPersonDao
package com.mongodb.spring.dao;import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import com.mongodb.pojo.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import org.springframework.data.mongodb.core.query.Query;import java.util.List;Component
public class PersonDao {AutowiredMongoTemplate mongoTemplate;public Person savePerson(Person person){//默认集合名与实体名同名Person savedPerson this.mongoTemplate.save(person);return savedPerson;}public ListPerson queryPersonListByName(String name) {Query query Query.query(Criteria.where(name).is(name));return this.mongoTemplate.find(query,Person.class);}/** 分页查询* */public ListPerson queryPersonListByPage(Integer page, Integer rows) {Query query new Query().limit(rows).skip((page - 1) * rows);return this.mongoTemplate.find(query, Person.class);}/** 更新数据* */public UpdateResult update(Person person){Query query Query.query(Criteria.where(id).is(person.getId()));Update update Update.update(age,person.getAge());return this.mongoTemplate.updateMulti(query,update,Person.class);}/** 删除数据* */public DeleteResult deleteResultById(String id){Query query Query.query(Criteria.where(id).is(id));return this.mongoTemplate.remove(query,Person.class);}
}编写启动类
package com.mongodb.spring;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
public class MongoApplication {public static void main(String[] args) {SpringApplication.run(MongoApplication.class,args);}
}测试单元
package com.mongodb.spring;import com.mongodb.client.result.UpdateResult;
import com.mongodb.spring.dao.PersonDao;
import com.mongodb.pojo.Address;
import com.mongodb.pojo.Person;
import org.bson.types.ObjectId;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.List;RunWith(SpringRunner.class)
SpringBootTest
public class TestPersonDao {Autowiredprivate PersonDao personDao;/** 新增* */Testpublic void testSave(){Person person new Person(ObjectId.get(), 张三, 20, new Address(人民路, 上海市, 666666));System.out.println(this.personDao.savePerson(person));;}Testpublic void testQuery() {ListPerson personList this.personDao.queryPersonListByName(张三);for (Person person : personList) {System.out.println(person);}}Testpublic void testQueryByPage(){ListPerson personList this.personDao.queryPersonListByPage(1,3);for (Person person : personList) {System.out.println(person);}}Testpublic void testUpdate() {Person person new Person();person.setId(new ObjectId(60667404d8d68907198c10f3));person.setAge(30);UpdateResult updateResult this.personDao.update(person);System.out.println(updateResult);}Testpublic void testDelete(){System.out.println(this.personDao.deleteResultById(6065d8edaccf9851f047b2d3));}
}