MongoDB总结

概述:

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。

Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

MongoDB服务端可运行在Linux、Windows平台,支持32位和64位应用,默认端口为27017。

推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

特点:

文档

MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。 多个键及其关联的值有序地放在一起就构成了文档。 MongoDB文档类似于JSON对象。字段的值可以包括其他文档,数组和文档数组。

优点:

  1. 文档(即对象)对应于许多编程语言中的本机数据类型
  1. 嵌入式文档和数组减少了对昂贵连接的需求
  1. 动态模式支持流畅的多态性

集合

集合就是一组文档,类似于关系数据库中的表。

集合是无模式的,集合中的文档可以是各式各样的。例如,{“hello,word”:“Mike”}和{“foo”: 3},它们的键不同,值的类型也不同,但是它们可以存放在同一个集合中,也就是不同模式的文档都可以放在同一个集合中。

既然集合中可以存放任何类型的文档,那么为什么还需要使用多个集合?

这是因为所有文档都放在同一个集合中,无论对于开发者还是管理员,都很难对集合进行管理,而且这种情形下,对集合的查询等操作效率都不高。所以在实际使用中,往往将文档分类存放在不同的集合中。

例如,对于网站的日志记录,可以根据日志的级别进行存储,Info级别日志存放在Info 集合中,Debug 级别日志存放在Debug 集合中,这样既方便了管理,也提供了查询性能。

但是需要注意的是,这种对文档进行划分来分别存储并不是MongoDB 的强制要求,用户可以灵活选择。

可以使用“.”按照命名空间将集合划分为子集合。

例如,对于一个博客系统,可能包括blog.user和blog.article两个子集合,这样划分只是让组织结构更好一些,blog集合和blog.user、blog.article没有任何关系。虽然子集合没有任何特殊的地方,但是使用子集合组织数据结构清晰,这也是MongoDB推荐的方法。

数据库

MongoDB 中多个文档组成集合,多个集合组成数据库。

一个MongoDB实例可以承载多个数据库。它们之间可以看作相互独立,每个数据库都有独立的权限控制。在磁盘上,不同的数据库存放在不同的文件中。

MongoDB中存在以下系统数据库。

Admin 数据库:一个权限数据库,如果创建用户的时候将该用户添加到admin 数据库中,那么该用户就自动继承了所有数据库的权限。

Local 数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。

Config 数据库:当MongoDB 使用分片模式时,config数据库在内部使用,用于保存分片的信息。

数据模型

一个MongoDB实例可以包含一组数据库,一个DataBase可以包含一组Collection(集合),一个集合可以包含一组Document(文档)。

一个Document包含一组field(字段),每一个字段都是一个key/value pair

key: 必须为字符串类型

value:可以包含如下类型

  1. 基本类型,例如,string,int,float,timestamp,binary 等类型
  1. 一个document
  1. 数组类型

增删改查:

增Create

db.集合名.insert(JSON数据)

db.集合名.insert(JSON数据)

删Delete

db.集合名.remove(条件 [,是否删除一条true是false否默认])

也就是默认删除多条

db.集合名.remove(条件 [是否删除一条true是false否默认])

也就是默认删除多条

改Update

db.集合名.update(条件, 新数据 [,是否新增,是否修改多条])

升级语法db.集合名.update(条件,{修改器:{键:值}})

db.集合名.update(条件, 新数据  [,是否新增,是否修改多条])

升级语法db.集合名.update(条件,{修改器:{键:值}})

查Read

db.集合名.find(条件 [,查询的列])

db.集合名.find(条件 [查询的列])

运算符

作用

$gt

大于

$gte

大于等于

$lt

小于

$lte

小于等于

$ne

不等于

$in

in

$nin

not in

存储数据类型:

MongoDB中每条记录称作一个文档,这个文档和我们平时用的JSON有点像,但也不完全一样。JSON是一种轻量级的数据交换格式。简洁和清晰的层次结构使得JSON成为理想的数据交换语言,JSON易于阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率,但是JSON也有它的局限性,比如它只有null、布尔、数字、字符串、数组和对象这几种数据类型,没有日期类型,只有一种数字类型,无法区分浮点数和整数,也没法表示正则表达式或者函数。由于这些局限性,BSON闪亮登场啦,BSON是一种类JSON的二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型,MongoDB使用BSON做为文档数据存储和网络传输格式。

数字

默认使用64位浮点型数值,如下:

db.collection.insert({x:3.1415926})
db.collection.insert({x:3})

对于整型值,我们可以使用NumberInt或者NumberLong表示,如下:

db.collection.insert({x:NumberInt(10)})
db.collection.insert({x:NumberLong(12)})

字符串

db.collection.insert({x:"hello MongoDB!"})

正则表达式

正则表达式主要用在查询里边,查询时我们可以使用正则表达式,语法和JavaScript中正则表达式的语法相同,比如查询所有keyxvaluehello开始的文档且不区分大小写:

db.collection.find({x:/^(hello)(.[a-zA-Z0-9])+/i})

数组

数组中的数据类型可以是多种多样的

db.collection.insert({x:[1,2,3,4,new Date()]})

日期

MongoDB支持Date类型的数据,可以直接new一个Date对象,如下:

db.collection.insert({x:new Date()})

内嵌文档

一个文档也可以作为另一个文档的value,如下:

db.collection.insert({name:"三国演义",author:{name:"罗贯中",age:99}});

索引:

查询索引:

db.collection.getIndexes()

结果如下:

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "collection"
    }
]

创建索引:

现在我的集合中有10000个文档,我想要查询x1的文档,我的查询操作如下:

db.collection.find({x:1})

这种查询默认情况下会做全表扫描,我们可以用上篇文章介绍的explain()来查看一下查询计划,如下:

db.collection.find({x:1}).explain("executionStats")

结果如下:

{
    "queryPlanner" : {
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 1,
        "executionTimeMillis" : 15,
        "totalKeysExamined" : 0,
        "totalDocsExamined" : 10000,
        "executionStages" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "x" : {
                    "$eq" : 1.0
                }
            },
            "nReturned" : 1,
            "executionTimeMillisEstimate" : 29,
            "works" : 10002,
            "advanced" : 1,
            "needTime" : 10000,
            "needYield" : 0,
            "saveState" : 78,
            "restoreState" : 78,
            "isEOF" : 1,
            "invalidates" : 0,
            "direction" : "forward",
            "docsExamined" : 10000
        }
    },
    "serverInfo" : {
    },
    "ok" : 1.0
}

进行了全表扫描,效率低

创建索引:

db.collection.ensureIndex({x:1})

1表示升序,-1表示降序。

我们也可以自定义名字:

db.collection.ensureIndex({x:1},{name:"myfirstindex"})

索引参数:

db.collection.ensureIndex({x:1},{name:"myfirstindex",dropDups:true,background:true,unique:true,sparse:true,v:1,weights:99999})

1.name表示索引的名称

2.dropDups表示创建唯一性索引时如果出现重复,则将重复的删除,只保留第一个

3.background是否在后台创建索引,在后台创建索引不影响数据库当前的操作,默认为false

4.unique是否创建唯一索引,默认false

5.sparse对文档中不存在的字段是否不起用索引,默认false

6.v表示索引的版本号,默认为2

7.weights表示索引的权重

删除索引:

根据索引名称删除索引:

db.collection.dropIndex("xIndex")

springboot整合MongoDB:

项目中常见:

 Query query = new Query(Criteria.where("targetId").is(targetId)
                        .and("targetType").is(targetType).and("targetOwnerPin").is(targetOwnerPin).and("floorId").is(floorId));

基于MongoTemplate 开发CRUD

常用方法

mongoTemplate.findAll(User.class): 查询User文档的全部数据
mongoTemplate.findById(, User.class): 查询User文档id为id的数据
mongoTemplate.find(query, User.class);: 根据query内的查询条件查询
mongoTemplate.upsert(query, update, User.class): 修改
mongoTemplate.remove(query, User.class): 删除
mongoTemplate.insert(User): 新增

Query对象

1、创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)

2、 精准条件:criteria.and(“key”).is(“条件”)

模糊条件:criteria.and(“key”).regex(“条件”)

3、封装条件:query.addCriteria(criteria)

4、大于(创建新的criteria):Criteria gt = Criteria.where(“key”).gt(“条件”)

小于(创建新的criteria):Criteria lt = Criteria.where(“key”).lt(“条件”)

5、Query.addCriteria(new Criteria().andOperator(gt,lt));

6、一个query中只能有一个andOperator()。其参数也可以是Criteria数组。

7、排序 :query.with(new Sort(Sort.Direction.ASC, "age"). and(new Sort(Sort.Direction.DESC, "date")))

MongoDB优缺点:

优点:

  1. 面向文档存储(类JSON数据模式简单而强大)
  1. Auto- Sharding自动分片

缺点:

  1. 不支持事务(进行开发时需要注意,哪些功能需要使用数据库提供的事务支持)
  1. MongoDB占用空间过大

你可能感兴趣的:(mongodb,数据库,nosql)