MongoDB-1入门介绍

NoSQL

NoSQL(NoSQL = Not Only SQL),意即反SQL运动,指的是非关系型的数据库

优点

1、对数据库高并发读写。

2、对海量数据的高效率存储和访问。

3、对数据库的高可扩展性和高可用性。

弱点:

1、数据库事务一致性需求

2、数据库的写实时性和读实时性需求

3、对复杂的SQL查询,特别是多表关联查询的需求

简介

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

它支持的数据结构非常松散,数据格式是BSON ,一种类似

JSON的二进制形式的存储格式,简称Binary JSON ,和JSON一样支持内嵌的文档对象和

数组对象,因此可以存储比较复杂的数据类型。

Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的

绝大部分功能,而且还支持对数据建立索引。

原则上 Oracle 和 MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务)。

MongoDB术语与SQL术语对比

MongoDB与关系型数据库性能对比

特点

半结构化

在一个集合中,文档所拥有的字段并不需要是相同的,而且也不需要对所用的字段进行声明。因此,MongoDB具有很明显的半结构化特点。除了松散的表结构,文档还可以支持多级的嵌套、数组等灵活的数据类型,非常契合面向对象的编程模型。

弱关系

MongoDB没有外键的约束,也没有非常强大的表连接能力。类似的功能需要使用聚合管道技术来弥补

支持海量数据、高可用

复制集提供99.999%高可用

分片架构支持海量数据和无缝扩容

轻松支持TB-PB数量级

应用场景

游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新;

物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来;

社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能;

物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析;

视频直播,使用 MongoDB 存储用户信息、礼物信息等;

大数据应用,使用云数据库MongoDB作为大数据的云存储系统,随时进行数据提取分析,掌握行业动态。|

是否使用MongoDB判断

只要有一项需求满足就可以考虑使用MongoDB,匹配越多,选择MongoDB越合适。

安装

#拉取镜像

docker pull mongo:latest

#创建和启动容器

docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo

#进入容器

docker exec -it mymongo/bin/bash

#使用MongoDB客户端进行操作

mongo

show dbs #查询所有的数据库

admin 0.000GB

config 0.000GB

local 0.000GB

相关工具

官方GUI工具------COMPASS

MongoDB图形化管理工具(GUI),能够帮助您在不需要知道MongoDB查询语法的前提下,便利地分析和理解您的数据库模式,并且帮助您可视化地构建查询。

下载地址:https://www.mongodb.com/zh-cn/products/compass

Mongo shell

使用js

shell 复制代码
load("books.js")
javascript 复制代码
var tags = ["nosql","mongodb","document","developer","popular"];
var types = ["technology","sociality","travel","novel","literature"];
var books=[];
for(var i=0;i<50;i++){
    var typeIdx = Math.floor(Math.random()*types.length);
    var tagIdx = Math.floor(Math.random()*tags.length);
    var favCount = Math.floor(Math.random()*100);
    var book = {
        title: "book-"+i,
        type: types[typeIdx],
        tag: tags[tagIdx],
        favCount: favCount,
        author: "xxx"+i
    };
    books.push(book)
}
db.books.insertMany(books);

优化手段

索引

B树索引。【Mysql Innodb引擎使用B+树】

MongoDB支持多种索引类型,包括:

单键索引(Single Key Index):只对一个字段进行索引。在MongoDB中,默认创建的_Id索引就是单键索引。

复合索引(Compound Index):对多个字段进行索引。例如,如果经常需要根据两个或更多字段进行查询,那么创建复合索引可以提高查询效率。

多键索引(Multikey Index):针对数组或嵌套文档的字段进行索引。多键索引会为数组的每个元素建立一条索引,允许在数组或嵌套文档字段上进行查询。

地理空间索引(Geospatial Index):对包含地理坐标的字段进行索引,以支持地理位置相关的查询。

文本索引(Text Index):对文本字段进行全文索引,以支持文本搜索和自然语言查询。

使用聚合管道

MongoDB支持聚合管道操作,可以将多个操作合并成一个操作,以减少网络通信和磁盘IO。例如,可以使用聚合管道来实现分页查询,将排序、投影和分页操作合并成一个操作。

javascript 复制代码
在MongoDB中,可以使用聚合管道来实现自定义条件搜索、排序、投影和分页。
以下是一个示例:

假设你有一个books集合,你希望根据某些条件搜索书籍,
然后根据某个字段(例如rating)进行排序,只返回你感兴趣的字段,并将其分页。

以下是具体的代码示例:

javascript
const mongoose = require('mongoose');  
const Book = mongoose.model('Book', new mongoose.Schema({ name: String, rating: Number }));  
  
// 定义搜索条件  
const searchCondition = { name: /search keyword/ };  
  
// 定义聚合管道  
const pipeline = [];  
  
// 添加匹配操作  
pipeline.push({  
  $match: searchCondition  
});  
  
// 添加排序操作  
pipeline.push({  
  $sort: { rating: -1 }  // 按 rating 字段降序排序  
});  
  
// 添加投影操作  
pipeline.push({  
  $project: {  
    _id: 1,  // 包含 _id 字段  
    name: 1,  // 包含 name 字段  
    rating: 1  // 包含 rating 字段  
  }  
});  
  
// 添加分页操作  
const skip = (page - 1) * limit;  // 计算跳过的数量  
pipeline.push({  
  $skip: skip  
});  
pipeline.push({  
  $limit: limit  // 假设 limit 是每页的数量  
});  
  
// 执行聚合查询  
Book.aggregate(pipeline, function(err, results) {  
  if (err) throw err;  
  console.log(results);  
});
在这个例子中,$match操作符用于满足自定义搜索条件,
$sort操作符用于排序,$project操作符用于投影,$skip和$limit操作符用于分页。
请注意,$skip和$limit的使用顺序很重要,因为$skip必须在$limit之前,
否则无法得到正确的结果。

使用数据分片

MongoDB支持数据分片,可以将数据分布到多个服务器上,以提高性能和可用性。例如,可以将用户数据按照地理位置进行分片,将用户数据分布到不同的服务器上,这样查询时就会更快

使用副本集

MongoDB支持副本集,可以提高数据的可用性和性能。例如,可以将读操作分发到副本集中的从节点上,以减轻主节点的负载。

定期删除不再使用的数据

相关推荐
tatasix17 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。30 分钟前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了31 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度33 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮35 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9991 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
苏-言2 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
Ljw...2 小时前
索引(MySQL)
数据库·mysql·索引