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

定期删除不再使用的数据

相关推荐
十叶知秋9 分钟前
【jmeter】jmeter的线程组功能的详细介绍
数据库·jmeter·性能测试
瓜牛_gn2 小时前
mysql特性
数据库·mysql
奶糖趣多多3 小时前
Redis知识点
数据库·redis·缓存
CoderIsArt4 小时前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
师太,答应老衲吧6 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Channing Lewis7 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
毕业设计制作和分享8 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil278 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk9 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境9 小时前
第02章 MySQL环境搭建
数据库·mysql