学习目标:

  • 理解MongoDb的特点和体系结构
  • 掌握常用的MongoDB命令
  • 能够运用Java操作MongoDB
  • 使用SpringDataMongoDB完成吐槽微服务的开发

MongoDB简介

吐槽和评论数据特点分析

吐槽和评论两项功能存在以下特点:

(1)数据量大

(2)写入操作频繁

(3)价值较低

对于这样的数据,我们更适合使用MongoDB来实现数据的存储

什么是MongoDB

MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门 的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存 储比较复杂的数据类型。
MongoDB 的官方网站地址是:http://www.mongodb.org/

MongoDB的特点

MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。
具体特点总结如下:
(1)面向集合存储,易于存储对象类型的数据
(2)模式自由
(3)支持动态查询
(4)支持完全索引,包含内部对象
(5)支持复制和故障恢复
(6)使用高效的二进制数据存储,包括大型对象(如视频等)
(7)自动处理碎片,以支持云计算层次的扩展性
(8)支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++语言的驱动程序,社区中也提供了对 Erlang 及.NET 等平台的驱动程序
(9) 文件存储格式为 BSON(一种 JSON 的扩展)

MongoDB体系结构

MongoDB 的逻辑结构是一种层次结构。主要由:

  • 文档(document)
  • 集合(collection)
  • 数据库(database)

这三部分组成的。逻辑结构是面向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。
(1)MongoDB 的文档(document),相当于关系数据库中的一行记录。
(2)多个文档组成一个集合(collection),相当于关系数据库的表。
(3)多个集合(collection),逻辑上组织在一起,就是数据库(database)。
(4)一个 MongoDB 实例支持多个数据库(database)。

文档(document)、集合(collection)、数据库(database)的层次结构如下图:

下表是MongoDB与MySQL数据库逻辑结构概念的对比:


(1)一个mongodb实例可以创建多个数据库

(2)一个数据库可以创建多个集合

(3)一个集合可以包括多个文档

连接mongodb

mongodb的使用方式是客户服务器模式,即使用一个客户端连接mongodb数据库(服务端)。

命令格式:

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

mongodb:// 固定前缀

username:账号,可不填

password:密码,可不填

host:主机名或ip地址,只有host主机名为必填项。

port:端口,可不填,默认27017

/database:连接某一个数据库

?options:连接参数,key/value对

例子:

mongodb://localhost 连接本地数据库27017端口
mongodb://root:itcast@localhost 使用用户名root密码为itcast连接本地数据库27017端口
mongodb://localhost,localhost:27018,localhost:27019,连接三台主从服务器,端口为27017、27018、27019
数据类型

基本数据类型

null:用于表示空值或者不存在的字段,{“x”:null}布尔型:布尔类型有两个值true和false,{“x”:true}数值:shell默认使用64为浮点型数值。{“x”:3.14}或{“x”:3}。对于整型值,可以使用NumberInt(4字节符号整数)或NumberLong(8字节符号整数),{“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}字符串:UTF-8字符串都可以表示为字符串类型的数据,{“x”:“呵呵”}日期:日期被存储为自新纪元依赖经过的毫秒数,不存储时区,{“x”:new Date()}正则表达式:查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相同,{“x”:/[abc]/}数组:数据列表或数据集可以表示为数组,{“x”: [“a“,“b”,”c”]}内嵌文档:文档可以嵌套其他文档,被嵌套的文档作为值来处理,{“x”:{“y”:3 }}对象Id:对象id是一个12字节的字符串,是文档的唯一标识,{“x”: objectId() }二进制数据:二进制数据是一个任意字节的字符串。它不能直接在shell中使用。如果要将非utf-字符保存到数据库中,二进制数据是唯一的方式。代码:查询和文档中可以包括任何JavaScript代码,{“x”:function(){/…/}}

走进MongoDB

MongoDB安装与启动

  • window系统MongoDB安装与启动

双击“资源\微服务相关\配套软件\mongodb”中的“mongodb-win32-x86_64-2008plusssl-3.2.10-signed.msi” 按照提示步骤安装即可。安装完成后,软件会安装在C:\ProgramFiles\MongoDB 目录中。

我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我将C:\ProgramFiles\MongoDB\Server\3.2\bin 设置到环境变量path中。

启动:
(1)首先打开命令提示符,创建一个用于存放数据的目录

md d:\data

(2)启动服务

mongod ‐‐dbpath=d:\data

我们在启动信息中可以看到,mongoDB的默认端口是27017

如果我们想改变默认的启动端口,可以通过–port来指定端口

在命令提示符输入以下命令即可完成登陆

mongo

退出mongodb

exit

启动mongodb服务,

命令执行后,浏览器中输入http://127.0.0.1:27017看到如下界面即说明启动成功

出现下图说明安装成功

  • Docker 环境下MongoDB安装

在宿主机创建mongo容器

docker run ‐di ‐‐name=tensquare_mongo ‐p 27017:27017 mongo

远程登录

mongo 192.168.184.134

安装studio3t

studio3t是mongodb优秀的客户端工具。官方地址在https://studio3t.com/

常用命令

以吐槽表为例讲解MongoDB常用命令

选择和创建数据库

选择和创建数据库的语法格式:

use 数据库名称

如果数据库不存在则自动创建

以下语句创建spit数据库

use spitdb
创建集合与删除集合

集合相当于关系数据库中的表,一个数据库可以创建多个集合,一个集合是将相同类型的文档管理起来

创建集合格式:

db.createCollection(name, options)
name: 新创建的集合名称
options: 创建参数

删除集合格式:

db.collection.drop()

例子:

#删除student集合
db.student.drop()
插入与查询文档

插入文档的语法格式:

db.集合名称.insert(数据);

我们这里可以插入以下测试数据:

db.spit.insert({content:"听说十次方课程很给力呀",userid:"1011",nickname:"小雅",visits:NumberInt(902)})

查询集合的语法格式:

db.集合名称.find()

如果我们要查询spit集合的所有文档,我们输入以下命令

db.spit.find()

这里你会发现每条文档会有一个叫_id的字段,这个相当于我们原来关系数据库中表的主键,当你在插入文档记录时没有指定该字段,MongoDB会自动创建,其类型是ObjectID类型。如果我们在插入文档记录时指定该字段也可以,其类型可以是ObjectID类型,也可以是MongoDB支持的任意类型。

输入以下测试语句:

db.spit.insert({_id:"1",content:"我还是没有想明白到底为啥出错",userid:"1012",nickname:"小明",visits:NumberInt(2020)});
db.spit.insert({_id:"2",content:"加班到半夜",userid:"1013",nickname:"凯撒",visits:NumberInt(1023)});
db.spit.insert({_id:"3",content:"手机流量超了咋办?",userid:"1013",nickname:"凯撒",visits:NumberInt(111)});
db.spit.insert({_id:"4",content:"坚持就是胜利",userid:"1014",nickname:"诺诺",visits:NumberInt(1223)});

如果我想按一定条件来查询,比如我想查询userid为1013的记录,怎么办?很简单!只要在find()中添加参数即可,参数也是json格式,如下:

db.spit.find({userid:'1013'})

如果你只需要返回符合条件的第一条数据,我们可以使用findOne命令来实现

db.spit.findOne({userid:'1013'})

如果你想返回指定条数的记录,可以在find方法后调用limit来返回结果,例如:

db.spit.find().limit(3)
修改与删除文档

修改文档的语法结构:

db.集合名称.update(条件,修改后的数据)

如果我们想修改_id为1的记录,浏览量为1000,输入以下语句:

db.spit.update({_id:"1"},{visits:NumberInt(1000)})

执行后,我们会发现,这条文档除了visits字段其它字段都不见了,为了解决这个问题,我们需要使用修改器$set来实现,命令如下:

db.spit.update({_id:"2"},{$set:{visits:NumberInt(2000)}})

这样就OK啦。

删除文档的语法结构:

db.集合名称.remove(条件)

以下语句可以将数据全部删除,请慎用

db.spit.remove({})

如果删除visits=1000的记录,输入以下语句

db.spit.remove({visits:1000})
统计条数

统计记录条件使用count()方法。以下语句统计spit集合的记录数

db.spit.count()

如果按条件统计 ,例如:统计userid为1013的记录条数

db.spit.count({userid:"1013"})
模糊查询

MongoDB的模糊查询是通过正则表达式的方式实现的。格式为:

/模糊查询字符串/

例如,我要查询吐槽内容包含“流量”的所有文档,代码如下:

db.spit.find({content:/流量/})

如果要查询吐槽内容中以“加班”开头的,代码如下:

db.spit.find({content:/^加班/})
大于 小于 不等于

<, <=, >, >= 这个操作符也是很常用的,格式如下:

db.集合名称.find({ "field" : { $gt: value }}) // 大于: field > value
db.集合名称.find({ "field" : { $lt: value }}) // 小于: field < value
db.集合名称.find({ "field" : { $gte: value }}) // 大于等于: field >= value
db.集合名称.find({ "field" : { $lte: value }}) // 小于等于: field <= value
db.集合名称.find({ "field" : { $ne: value }}) // 不等于: field != value

示例:查询吐槽浏览量大于1000的记录

db.spit.find({visits:{$gt:1000}})
包含与不包含

包含使用$in操作符。

示例:查询吐槽集合中userid字段包含1013和1014的文档

db.spit.find({userid:{$in:["1013","1014"]}})

不包含使用$nin操作符。

示例:查询吐槽集合中userid字段不包含1013和1014的文档

db.spit.find({userid:{$nin:["1013","1014"]}})
条件连接

我们如果需要查询同时满足两个以上条件,需要使用$and操作符将条件进行关联。(相当于SQL的and)

格式为:

$and:[ { },{ },{ } ]

示例:查询吐槽集合中visits大于等于1000 并且小于2000的文档

db.spit.find({$and:[ {visits:{$gte:1000}} ,{visits:{$lt:2000} }]})

如果两个以上条件之间是或者的关系,我们使用 操作符进行关联,与前面and的使用方式相同

格式为:

$or:[ { },{ },{ } ]

示例:查询吐槽集合中userid为1013,或者浏览量小于2000的文档记录

db.spit.find({$or:[ {userid:"1013"} ,{visits:{$lt:2000} }]})
列值增长

如果我们想实现对某列值在原有值的基础上进行增加或减少,可以使用$inc运算符来实现

db.spit.update({_id:"2"},{$inc:{visits:NumberInt(1)}} )

Java操作MongoDB

mongodb-driver

mongodb-driver是mongo官方推出的java连接mongoDB的驱动包,相当于JDBC驱动。

我们通过一个入门的案例来了解mongodb-driver的基本使用。

查询全部记录

(1)创建工程 mongoDemo, 引入依赖

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

(2)创建测试类

/**
* MongoDb入门小demo
*/
public class MongoDemo {public static void main(String[] args) {MongoClient client=new MongoClient("192.168.184.134");//创建连接MongoDatabase spitdb = client.getDatabase("spitdb");//打开数据库MongoCollection<Document> spit = spitdb.getCollection("spit");//获取集合FindIterable<Document> documents = spit.find();//查询记录获取文档集合for(Document document:documents){System.out.println("内容:"+ document.getString("content"));System.out.println("用户ID:"+document.getString("userid"));System.out.println("浏览量:"+document.getInteger("visits"));} client.close();//关闭连接}
}
条件查询

BasicDBObject对象:表示一个具体的记录,BasicDBObject实现了DBObject,是keyvalue的数据结构,用起来和HashMap是基本一致的。

(1)查询userid为1013的记录

public class MongoDemo1 {public static void main(String[] args) {MongoClient client=new MongoClient("192.168.184.134");//创建连接MongoDatabase spitdb = client.getDatabase("spitdb");//打开数据库MongoCollection<Document> spit = spitdb.getCollection("spit");//获取集合BasicDBObject bson=new BasicDBObject("userid","1013");// 构建查询条件FindIterable<Document> documents = spit.find(bson);//查询记录获取结果集合for(Document document:documents){ //System.out.println("内容:"+ document.getString("content"));System.out.println("用户ID:"+document.getString("userid"));System.out.println("浏览量:"+document.getInteger("visits"));} client.close();//关闭连接}
}

(2)查询浏览量大于1000的记录

public class MongoDemo2 {public static void main(String[] args) {MongoClient client=new MongoClient("192.168.184.134");//创建连接MongoDatabase spitdb = client.getDatabase("spitdb");//打开数据库MongoCollection<Document> spit = spitdb.getCollection("spit");//获取集合BasicDBObject bson=new BasicDBObject("visits",new BasicDBObject("$gt",1000) );// 构建查询条件FindIterable<Document> documents = spit.find(bson);//查询记录获取结果集合for(Document document:documents){ System.out.println("内容:"+ document.getString("content"));System.out.println("用户ID:"+document.getString("userid"));System.out.println("浏览量:"+document.getInteger("visits"));} client.close();//关闭连接}
}
插入数据
public class MongoDemo3 {public static void main(String[] args) {MongoClient client=new MongoClient("192.168.184.134");//创建连接MongoDatabase spitdb = client.getDatabase("spitdb");//打开数据库MongoCollection<Document> spit = spitdb.getCollection("spit");//获取集合Map<String,Object> map=new HashMap();map.put("content","我要吐槽");map.put("userid","9999");map.put("visits",123);map.put("publishtime",new Date());Document document=new Document(map);spit.insertOne(document);//插入数据client.close();}
}

SpringDataMongoDB

SpringData家族成员之一,用于操作MongoDb的持久层框架,封装了底层的mongodbdriver。

官网主页: https://projects.spring.io/spring-data-mongodb/

我们十次方项目的吐槽微服务就采用SpringDataMongoDB框架

吐槽微服务

需求分析

采用SpringDataMongoDB框架实现吐槽微服务的持久层

实现功能:
(1)基本增删改查API
(2)根据上级ID查询吐槽列表
(3)吐槽点赞
(4)发布吐槽

代码编写

模块搭建

(1)搭建子模块tensquare_spit
(2)pom.xml引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐starter‐data‐mongodb</artifactId>
</dependency>
<dependency><groupId>com.tensquare</groupId><artifactId>tensquare_common</artifactId><version>1.0‐SNAPSHOT</version>
</dependency>

(3)创建application.yml

server:port: 9006
spring:application:name: tensquare‐spit #指定服务名data:mongodb:host: 192.168.184.134database: spitdb

(4)创建启动类

@SpringBootApplication
public class SpitApplication {public static void main(String[] args) {SpringApplication.run(SpitApplication.class, args);} @Beanpublic IdWorker idWorkker(){return new IdWorker(1, 1);}
}
基本增删改查API实现

(1)创建实体类

/**
* 吐槽
* @author Administrator
*/
public class Spit implements Serializable{@Idprivate String _id;private String content;private Date publishtime;private String userid;private String nickname;private Integer visits;private Integer thumbup;private Integer share;private Integer comment;private String state;private String parentid;// getter and setter .....
}

(2)创建数据访问接口

/**
* 吐槽数据访问层
* @author Administrator
*/
public interface SpitDao extends MongoRepository<Spit, String>{}

(3)创建业务逻辑类

com.tensquare.spit包下创建service包,包下创建类

@Service
public class SpitService {@Autowiredprivate SpitDao spitDao;@Autowiredprivate IdWorker idWorker;/*** 查询全部记录* @return*/public List<Spit> findAll(){return spitDao.findAll();}/*** 根据主键查询实体* @param id* @return*/public Spit findById(String id){Spit spit = spitDao.findById(id).get();return spit;} /*** 增加* @param spit*/public void add(Spit spit) {spit.set_id(idWorker.nextId()+""); //主键值spitDao.save(spit);} /*** 修改* @param spit*/  public void update(Spit spit) {spitDao.save(spit);} /*** 删除* @param id*/public void deleteById(String id) {spitDao.deleteById(id);}
}

(4)com.tensquare.spit包下创建controller类

@RestController
@CrossOrigin
@RequestMapping("/spit")
public class SpitController {@Autowiredprivate SpitService spitService;/*** 查询全部数据* @return*/@RequestMapping(method= RequestMethod.GET)public Result findAll(){return new Result(true, StatusCode.OK,"查询成功",spitService.findAll());} /*** 根据ID查询* @param id ID* @return*/@RequestMapping(value="/{id}",method=RequestMethod.GET)public Result findOne(@PathVariable String id){return new Result(true,StatusCode.OK,"查询成功",spitService.findById(id));} /*** 增加* @param spit*/@RequestMapping(method=RequestMethod.POST)public Result add(@RequestBody Spit spit ){spitService.add(spit);return new Result(true,StatusCode.OK,"增加成功");}/*** 修改* @param spit*/@RequestMapping(value="/{id}",method=RequestMethod.PUT)public Result update(@RequestBody Spit spit,@PathVariable String id ){spit.set_id(id);spitService.update(spit);return new Result(true,StatusCode.OK,"修改成功");}/*** 删除* @param id*/@RequestMapping(value="/{id}",method=RequestMethod.DELETE)public Result deleteById(@PathVariable String id ){spitService.deleteById(id);return new Result(true,StatusCode.OK,"删除成功");}
}
根据上级ID查询吐槽列表

(1)SpitDao新增方法定义

/**
* 根据上级ID查询吐槽列表(分页)
* @param parentid
* @param pageable
* @return
*/
public Page<Spit> findByParentid(String parentid,Pageable pageable);

(2)SpitService新增方法

/**
* 根据上级ID查询吐槽列表
* @param parentid
* @param page
* @param size
* @return
*/
public Page<Spit> findByParentid(String parentid,int page, int size){PageRequest pageRequest = PageRequest.of(page‐1, size);return spitDao.findByParentid(parentid, pageRequest);
}

(3)SpitController新增方法

/**
* 根据上级ID查询吐槽分页数据
* @param page
* @param size
* @return
*/
@RequestMapping(value="/comment/{parentId}/{page}/{size}",method=RequestMethod.GET)
public Result findByParentid(@PathVariable String parentId,@PathVariable int page,@PathVariable int size){Page<Spit> pageList = spitService.findByParentid(parentId,page,size);return new Result(true,StatusCode.OK,"查询成功",newPageResult<Spit>(pageList.getTotalElements(), pageList.getContent() ) );
}
吐槽点赞

我们看一下以下点赞的代码: SpitService 新增updateThumbup方法

/**
* 点赞
* @param id
*/
public void updateThumbup(String id){Spit spit = spitDao.findById(id).get();spit.setThumbup(spit.getThumbup()+1);spitDao.save(spit);
}

以上方法虽然实现起来比较简单,但是执行效率并不高,因为我只需要将点赞数加1就可
以了,没必要查询出所有字段修改后再更新所有字段。

我们可以使用MongoTemplate类来实现对某列的操作:
(1)修改SpitService

@Autowired
private MongoTemplate mongoTemplate;
/**
* 点赞
* @param id
*/
public void updateThumbup(String id){Query query=new Query();query.addCriteria(Criteria.where("_id").is(id));Update update=new Update();update.inc("thumbup",1);mongoTemplate.updateFirst(query,update,"spit");
}

(2)SpitController新增方法

/**
* 点赞
* @param id
* @return
*/
@RequestMapping(value="/thumbup/{id}",method=RequestMethod.PUT)
public Result updateThumbup(@PathVariable String id){spitService.updateThumbup(id);return new Result(true,StatusCode.OK,"点赞成功");
}
控制不能重复点赞

我们可以通过redis控制用户不能重复点赞

(1)首先引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐starter‐data‐redis</artifactId>
</dependency>

(2)修改application.yml

redis:host: 192.168.184.135

(3)修改SpitController代码逻辑

@Autowired
private RedisTemplate redisTemplate;
/**
* 吐槽点赞
* @param id
* @return
*/
@RequestMapping(value = "/thumbup/{id}", method = RequestMethod.PUT)
public Result updateThumbup(@PathVariable String id){//判断用户是否点过赞String userid="2023";// 后边我们会修改为当前登陆的用户if(redisTemplate.opsForValue().get("thumbup_"+userid+"_"+id)!=null){return new Result(false,StatusCode.REPERROR,"你已经点过赞了");} spitService.updateThumbup(id);redisTemplate.opsForValue().set( "thumbup_"+userid+"_"+ id,"1");return new Result(true,StatusCode.OK,"点赞成功");
}
发布吐槽

修改SpitService的add方法

/**
* 发布吐槽(或吐槽评论)
* @param spit
*/
public void add(Spit spit){spit.set_id( idWorker.nextId()+"" );spit.setPublishtime(new Date());//发布日期spit.setVisits(0);//浏览量spit.setShare(0);//分享数spit.setThumbup(0);//点赞数spit.setComment(0);//回复数spit.setState("1");//状态if(spit.getParentid()!=null && !"".equals(spit.getParentid())){//如果存在上级ID,评论Query query=new Query();query.addCriteria(Criteria.where("_id").is(spit.getParentid()));Update update=new Update();update.inc("comment",1);mongoTemplate.updateFirst(query,update,"spit");} spitDao.save(spit);
}
增加浏览量与分享数

学员实现。

文档型数据库MongoDB使用教程相关推荐

  1. mongodb单表最大记录数_SpringBoot+Cloud全家桶微服务实战项目之文档型数据库MongoDB四...

    ​一.MongoDB简介以及使用场景 MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种.它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富, ...

  2. spring cloud alibaba微服务原理与实战_SpringBoot+Cloud全家桶微服务实战项目之文档型数据库MongoDB四...

    ​一.MongoDB简介以及使用场景 MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种.它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富, ...

  3. 文档型数据库mongodb介绍2-副本集

    一. 副本集介绍 之前的文章介绍了 mongodb主从 mongodb提供了另外一种 基于副本集的集群 该方式 是一主一从的升级版  一主多从, 仍然是主节点负责写入 从节点定时同步主节点数据 使用该 ...

  4. 非关系型数据库 之 文档型数据库 MongoDB 的使用(Python3)

    文章目录 1.MongoDB 简介 1.1.简述 1.2.应用场景 1.3.优点 1.4.缺点 2.CentOS 操作 MongoDB 2.1.安装启动 2.1.1.下载安装 2.1.2.后台启动 2 ...

  5. 悉数11种主流NoSQL文档型数据库

    悉数11种主流NoSQL文档型数据库 文档型数据库是NoSQL中非常重要的一个分支,它主要用来存储.索引并管理面向文档的数据或者类似的半结构化数据.顾名思义,文档型数据库(面向文档数据库)的关键核心概 ...

  6. 文档型数据库列一般都是弱项

    文档型数据库一般都是以行为基础得,添加更新删除等操作,因为文档型数据的一般存储结构都是键值对.所以对列的概念很弱,比如有一些文档数据库,是无法对单列操作的,有时候想修改一列的值,只能所有数据全部重新添 ...

  7. 文档型数据库设计模式-如何存储树形数据

    在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系.在传统的关系型数据库中,就已经产生了各种解决方案. 此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型 ...

  8. 关系型数据库到文档型数据库的跨越

    1. 简介 在文档型NoSQL数据库出现之前,许多开发者一直绞尽脑汁思考,希望能想出更好的处理关系型数据库技术的方法,如今他们可能要跳出那种思维而另辟蹊径.本文将介绍关系型数据库和分布式文档型数据库的 ...

  9. MongoDB小型文档型数据库使用

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中 ...

  10. 文档型非关系数据库MongoDB经验总结

    文档型非关系数据库MongoDB 数据库基础概念 数据:能够输入到计算机中并被识别处理的信息集合 数据结构:研究一个数据集合中,数据元素关系 数据库:按照数据结构,存储管理数据的仓库.数据仓库是在数据 ...

最新文章

  1. 重新认识创业者与资本的博弈
  2. Maven 学习之旅
  3. C++菱形继承产生的问题和解决
  4. 每天一道LeetCode-----后缀表达式求值
  5. html显示mysql图片路径_MySQL MySQL 直接存储图片并在 html 页面中展示,点击下载 _好机友...
  6. 结对编程后传之做汉堡
  7. 门户网站CDN实战优化教学案例分享
  8. C#高级编程笔记(二)
  9. 线程的四种实现方式,一些方法及线程的同步
  10. 数据库系统概念第七版(Database System Concepts 7th)课后习题答案英文版
  11. JMP数据清洗之“拆分” — 快速实现一列拆分为多列
  12. word2007 计算机考试题库,2015年职称计算机考试题库word2007
  13. 找网络高手联系方式_怎么才能联系到网络高手(找网络大牛联系方式)
  14. DCDC电源芯片的引脚功能及应用-BUCK芯片和BOOST芯片
  15. ‘Staring Tomcat v8.0 Server at localhost ’ has encountered a problem 问题解决
  16. Point and Ask: Incorporating Pointing into VQA论文笔记
  17. Django(14)-应用及分布式路由
  18. LED的闪烁频率设定
  19. 嵌入式stm32项目开发 心率检测仪的设计与实现
  20. YOLOv5训练自己的数据集详解

热门文章

  1. 证监会计算机类笔试上岸经验,公务员考试笔试166分上岸经验(全干货)
  2. 用于创建此对象的程序是 Equation。您的计算机尚未安装此程序或此程序无响应。 若要编辑此对象,请安装 Equation或确保 Equation中的任何对话框都已关闭
  3. 用python实现房贷计算器
  4. c语言oj中的wa是什么意思,杭电oj1002题一直是WA ,然而格式什么的都对啊?求教OAO...
  5. Android 各版本gradle下载地址
  6. iexplore出错
  7. ajax 的四步法处理
  8. shell解析HTML
  9. c语言 源文件未编译,源文件未编译什么意思
  10. kafka学习七:kafka之集群篇