1 什么是MongoDB?
MongoDB是一个开源的文档数据库和领先的NoSQL(非关系型)数据库。
2 MongoDB是怎么组织、存储数据的?
一个数据库可以包含若干集合,一个集合也就是一张表(就像一个数组),包含了很多文档(也即数据记录,就像一个个对象),每个对象包含了很多字段(对象的键值对)。
数据的组织形式可以简单粗暴的理解成一个多维的对象数组,层级关系和对应的术语如下:
database > collection > document/data records > field(value)
3 使用方法
从安装开始
官网下载:https://www.mongodb.com/download-center/community
下载后将安装目录中mongo.exe所在路径添加到系统环境变量,例如:D:\MongoDB\Server\4.2\bin
打开mongoDB软件,打开cmd直接输入mongo即可运行mongo.exe,会显示当前版本,并连接到mongoDB(或者直接在mongo.exe所在文件夹用命令行输入mongo.exe运行mongoDB)。
此时在命令行可以直接对mongo进行创建、增删改查操作,并可以在mongoDB软件中刷新后看到。
增删改查API
database 级别操作
创建/切换数据库:use dbName
默认会有一个test数据库
查看当前所在所在数据库:db
显示所有数据库:show dbs
刚创建的空数据库是不会显示的,当插入一条记录后方可显示
删除当前所在数据库:db.dropDatabase()
如果当前没有选择数据库,则默认删除test数据库
collection 级别操作
创建collection:db.createCollection(name, options)
显示所有collection:show collections
删除collection:db.COLLECTION_NAME.drop()
过滤某些key:db.COLLECTION_NAME.find({},{KEY:1})
KEY表示要过滤的字段,1表示返回的结果包含这个字段,0表示不包含
document 级别操作
支持的数据类型
- String Integer Boolean Double Arrays Timestamp Object Null Symbol Date
- Binary data
- Regular expression
- Min/ Max keys - This type is used to compare a value against the lowest and highest BSON elements.
- Object ID − This datatype is used to store the document’s ID.(_id: ObjectId(4 bytes timestamp, 3 bytes machine id, 2 bytes process id,
3 bytes incrementer)) - Code − This datatype is used to store JavaScript code into the document.
增删改查
增加一个document(对象):db.COLLECTION_NAME.insert(document)
document可以是一个对象,也可以是一个数组(包含多个对象)
还可以使用save方法,插入的对象不含_id时,save和insert都会自动添加一个_id;含_id时,save会替换已有的含相同_id的对象
查询:db.COLLECTION_NAME.find()
find内的参数可以是
- {key: value} 按值查询
- {key: {$lt: value}} 按值的条件查询
- $lt - less than 小于 ($gt - 大于)
- $lte - less than equals 小于等于 ($gte - 大于等于)
- $ne - not equals 不等于
- $and: [{}, {}] - 同时满足多个条件
- $or: [{}, {}] - 只需满足一个条件
更新:db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)
例如:db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}})
还可添加第三个参数:,{multi:true}
替换:db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})
删除:db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)
删除所有:db.mycol.remove({})
指定返回字段Projection:db.COLLECTION_NAME.find({},{KEY:1})
1表示显示,0表示不显示
限制返回结果的数量:db.COLLECTION_NAME.find().limit(NUMBER)
NUMBER表示最多返回的数量,不传返回全部结果
跳过指定结果:.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
如果返回结果有N个,那么跳过第NUMBER个,返回其他的结果;NUMBER默认为0
排序:db.COLLECTION_NAME.find().sort({KEY:1})
根据KEY字段排序,1为升序,-1为降序,默认升序
创建索引:db.COLLECTION_NAME.ensureIndex({KEY:1})
指定索引的字段KEY,以及升序1降序-1;字段可以有多个
聚合操作:db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
用来同时处理多个documents
示例:
// 表示以by_user字段值来分组,每遇到一个相同的值,总数sum增加1
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
// 返回结果:
{
"result" : [
{
"_id" : "tutorials point",
"num_tutorial" : 2
},
{
"_id" : "Neo4j",
"num_tutorial" : 1
}
],
"ok" : 1}
其他聚合相关的表达式:
表达式 | 描述 | 用法示例 |
---|---|---|
$sum | 对指定字段的值求和 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 对指定字段的值求平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 对指定字段的值求最小值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 对指定字段的值求最大值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
4 MongoDB是如何工作的
Replication 副本
Replication是mongoDB的一种数据备份策略:
Replication is the process of synchronizing data across multiple servers.
mongoDB将一份数据复制成几份组成一个副本集,包含一个primary node和多个sedondary node,每个节点的数据保持一致,客户应用程序只对primary进行读写操作。
Sharding 分片
分片是mongoDB的一种横向数据存储拓展策略:
Sharding is the process of storing data records across multiple machines and it is MongoDB's approach to meeting the demands of data growth.
它由以下三部分组成,工作流程是:router(可以理解为mongoDB实例)作为对客户应用程序开放的接口,将用户请求均匀分配到不同的分片;
一个分片就是一个独立的副本集,用来存储数据,通常一个分片集群对应多个router来分流用户发来的请求;
配置服务器用来存储整个数据集群到每个分片的映射关系,用来指导router如何将用户请求导向特定的分片。一个数据集群包含三个配置服务器。
参考教程:https://www.tutorialspoint.com/mongodb/mongodb_relationships.htm
MongoDB手册:https://mongodb-documentation.readthedocs.io/en/latest/