Mongodb QuickStart

Mongodb QuickStart

Mongodb 概念

Mongodb是开源,高性能,无模式的文档型数据库。属于NoSql非关系型数据库。
它支持的数据结构非常松散,是一种类似于JSON的格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活。

适用场景:

1)社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
2)游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
3)物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将
订单所有的变更读取出来。
4)物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
5)视频直播,使用 MongoDB 存储用户信息、点赞互动信息等

mongodb中主要包含以下概念:

  • database: 数据库
  • collection: 集合 多个document的合集 (可以理解成mysql中的表)
  • document: 文档,(可以理解成mysql中的一行数据)
  • field: 字段 (可以理解成mysql 中的列名)
  • value: 值 (可以理解成mysql中的列值)
SQL术语/概念 MongoDB术语/概念 备注
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
嵌入文档 MongoDB通过嵌入式文档来替代多表连接
primary key primary key 主键,MongoDB自动将_id字段设置为主键
BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称Binary JSON。BSON和JSON一样,支持
内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。

mongodb 特点

(1)高性能:MongoDB提供高性能的数据持久性。特别是,对嵌入式数据模型的支持减少了数据库系统上的I/O活动。索引支持更快的查询,并且可以包含来自嵌入式文档和数组的键。(文本索引解决搜索的需求、TTL索引解决历史数据自动过期的需求、地理位置索引可用于构建各种 O2O 应用)mmapv1、wiredtiger、mongorocks(rocksdb)、in-memory 等多引擎支持满足各种场景需求。Gridfs解决文件存储的需求。
(2)高可用性:MongoDB的复制工具称为副本集(replica set),它可提供自动故障转移和数据冗余。
(3)高扩展性:MongoDB提供了水平可扩展性作为其核心功能的一部分。分片将数据分布在一组集群的机器上。(海量数据存储,服务能力水平扩展)从3.4开始,MongoDB支持基于片键创建数据区域。一个平衡的集群中,MongoDB将一个区域所覆盖的读写只定向到该区域内的那些片。
(4)丰富的查询支持:MongoDB支持丰富的查询语言,支持读和写操作(CRUD),比如数据聚合、文本搜索和地理空间查询等。
(5)其他特点:如无模式(动态模式)、灵活的文档模型、

安装

ubuntu 的安装
https://blog.csdn.net/fhjdzkp/article/details/104360231

  • 图形化管理官方推荐使用
    Compass-图形化界面客户端

常用命令

前提:
假设有存放博客园文章评论的数据存到mongoDB中,数据结构如下
db: article
专栏文章评论 comment

字段名称 字段含义 字段类型 备注
_id ID ObjectId或String Mongo的主键的字段
articleid 文章ID String
content 评论内容 String
userid 评论人ID String
nickname 评论人昵称 String
createdatetime 评论的日期时间 Date
likenum 点赞数 Int32
replynum 回复数 Int32
state 状态 String 0:不可见;1:可见;
repparentidlynum 上级ID String 如果为0表示文章的顶级评论

数据库操作

use database

如果数据库存在则切换到对应的数据库,不存在则创建

db

可以查看当前在哪个数据库下

  • 查看所有数据库
show dbs
show database
  • 删除数据库
// 先切换到对应数据库
use database;
db.dropDatabase(); // 删除数据库

集合操作

// 创建集合,显示创建
db.createCollection(集合名字);
// 查看当前库中的表
show collections
show tables
  • 集合的命名规则
集合的命名规范:
集合名不能是空字符串""。
集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
集合名不能以"system."开头,这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除
非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
  • 集合删除
db.集合名.drop();

Document 基本CRUD

文档创建

db.集合名.insert()

db.comment.insert({
	"articleid": "200000",
	"content": "happy 天气好好",
	"userid": "1000",
	"nickname": "amber",
	"createdatetime": new Date(),
	"likenum": NumberInt(10),
	"state": null
})

Tips:
提示:
1)comment集合如果不存在,则会隐式创建
2)mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字)
3)插入当前日期使用 new Date()
4)插入的数据没有指定 _id ,会自动生成主键值
5)如果某字段没值,可以赋值为null,或不写该字段。

批量插入
db.collection.insertMany([ < document 1 > , < document 2 > , ...], {
	writeConcern: < document > ,
	ordered: < boolean >
})

文档查看

  1. 查看所有文档
    db.collection.find( , [projection])
    | 参数 | 类型 | 备注 |
    | ------------ | ------------ | ------------ |
    | query | Document | 可选。使用查询运算符指定选择筛选器。若要返回集合中的所有文档,请省略此参数或传递空文档
    ( {} ) |
    |projection | document|可选。指定要在与查询筛选器匹配的文档中返回的字段(投影)。若要返回匹配文档中的所有字段,
    请省略此参数。|
db.comment.find()
  1. 查看指定文档
db.comment.find({"nickname":"amber"})

查询结果

{
	"_id": ObjectId("5eef026e3c7322faaad75097"),
	"articleid": "200000",
	"content": "今天天气真好,阳光明媚",
	"userid": "00786",
	"nickname": "amber",
	"createdatetime": ISODate("2020-06-21T06:47:10.437Z"),
	"likenum": 10,
	"state": null
}
  1. 投影查询(Projection Query)如果只想显示nickname那一列
db.comment.find({"nickname":"amber"}, {nickname: 1, _id: 0})

Result:

{ "nickname" : "amber" }
  1. 查找符合条件的第一条
db.comment.findOne({userid:'00786'})
文档分页

查询计数
语法:

db.collection.count(query, options)

查询所有计数

db.comment.count()

指定查询计数

db.comment.count({userid: "1000"})

返回前3条数据

db.comment.find().limit(3)

查询滴3条和第四条记录,ship表示跳过前面几条

db.comment.find().limit(2).skip(2)
排序查询

语法

db.集合名称.find().sort(排序方式)

db.comment.find().sort({_id: -1})
正则的复杂条件查询
db.集合.find({字段:/正则表达式/})

db.comment.find({userid: /00/});
比较查询
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
包含查询

包含

db.comment.find({userid:{$in:["1001","1004"]}})

不包含

db.comment.find({userid:{$nin:["1001","1004"]}})
满足多个条件查询
db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]})

文档的更新

语法

db.collection.update(query, update, options)
或者
db.collection.update( < query > , < update > , {
			upsert: < boolean > ,
			multi: < boolean > ,
			writeConcern: < document > ,
			collation: < document > ,
			arrayFilters: [ < filterdocument1 > , ...],
			hint: < document | string > // Available starting in MongoDB 4.2 } )

参数说明

参数 类型 备注
query Document 查询条件
update Document 更新后的结果
upsert boolean 可选。为true,没有与查询条件匹配的文档时创建默认值为false
multi boolean 可选。为true,则更新符合查询条件的多个文档。如果设置为false,则更新一个文档。默认值为false
writeConcern document 可选。表示写问题的文档。抛出异常的级别。
collation document 可选,用于校对规则
arrayFilters array 可选。一个筛选文档数组,用于确定要为数组字段上的更新操作修改哪些数组元素
hint Documentor string 可选。指定用于支持查询谓词的索引的文档或字符串。该选项可以采用索引规范文档或索引名称字符串
  • 覆盖修改
db.comment.update({userid:"1000"},{nickName: "xixi"})

执行后,我们会发现,这条文档除了nickName字段其它字段都不见了,

  • 局部修改
    再次插入
db.comment.insert({
	"articleid": "200000",
	"content": "happy 天气好好",
	"userid": "1000",
	"nickname": "amber",
	"createdatetime": new Date(),
	"likenum": NumberInt(10),
	"state": null
})

执行局部修改

db.comment.update({userid:"1000"},{$set: {nickName: "haha"}})
  • 批量的修改
db.comment.update({userid:"1000"},{$set: {nickName: "haha"}}, { multi: true})
文档删除
db.集合名.remove()

如 删除全部

db.comment.remove({})

删除指定

db.comment.remove({_id:指定的id})

常用命令

选择切换数据库:use articledb 
插入数据:db.comment.insert({bson数据}) 
查询所有数据:db.comment.find(); 
条件查询数据:db.comment.find({条件}) 
查询符合条件的第一条记录:db.comment.findOne({条件}) 
查询符合条件的前几条记录:db.comment.find({条件}).limit(条数) 
查询符合条件的跳过的记录:db.comment.find({条件}).skip(条数) 
修改数据:db.comment.update({条件},{修改后的数据}) 或db.comment.update({条件},{$set:{要修改部分的字段:数据})
修改数据并自增某字段值:db.comment.update({条件},{$inc:{自增的字段:步进值}}) 
删除数据:db.comment.remove({条件})
统计查询:db.comment.count({条件})
模糊查询:db.comment.find({字段名:/正则表达式/})
条件比较运算:db.comment.find({字段名:{$gt:值}})
包含查询:db.comment.find({字段名:{$in:[值1,值2]}})或db.comment.find({字段名:{$nin:[值1,值2]}})
条件连接查询:db.comment.find({$and:[{条件1},{条件2}]})或db.comment.find({$or:[{条件1},{条件2}]})

索引

索引类型

  1. 单索引
    单个字段的索引
  2. 符合索引
    多个字段组成的索引
  3. 其他索引
    地理空间索引(Geospatial Index)、文本索引(Text Indexes)、哈希索引(Hashed Indexes)。

创建索引

MongoDB索引使用B树数据结构(确切的说是B-Tree,MySQL是B+Tree)

db.collection.createIndex(keys, options)

包含字段和值对的文档,其中字段是索引键,值描述该字段的索引类型。对于字段上的升序索引,请指定值1;对于降序索引,请指定值-1。比如: {字段:1或-1} ,其中1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。

db.comment.createIndex({userid:1})

查看索引

db.集合名.getIndexes()
db.comment.getIndexes()

删除索引

db.集合名.dropIndex(index)

db.集合名.dropIndex(索引名称)
或者
db.集合名.dropIndex({userid:1})

删除所有索引

db.collection.dropIndexes()

索引的使用

db.collection.find(query,options).explain(options)

db.comment.find({userid:"1001"}).explain()

你可能感兴趣的:(Mongodb QuickStart)