mongodb-入门

Posted by 麦子 on Sunday, 2019年09月15日

[TOC]

说明:本文来自于https://www.bilibili.com/video/av36394924/?p=2视频讲解

官方文档:https://docs.mongodb.com/ 4.2版本

**中文社区:http://mongoing.com/**

mongodb优势

它是一个内存数据库,数据都是放在内存里面的。对数据的操作大部分都在内存中,但mongodb并不是单纯的内存数据库。

查询性能是MongoDB的强项之一。它将大部分可工作的数据存储在RAM中。所有数据都保留在硬盘中,但在查询期间,它不会从硬盘中获取数据。它相当于从本地RAM获取,因此能够提供更快的速度。在这里,重要的是要有正确的索引和足够大的RAM来从MongoDB的性能中获益。

MongoDB电商应用场景

转载地址:https://blog.csdn.net/lmjy102/article/details/68945350

MongoDB已经在多个站点部署,其主要场景如下:

1)网站实时数据处理。它非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

2)缓存。由于性能很高,它适合作为信息基础设施的缓存层。在系统重启之后,由它搭建的持久化缓存层可以避免下层的数据源过载。

3)高伸缩性的场景。非常适合由数十或数百台服务器组成的数据库,它的路线图中已经包含对MapReduce引擎的内置支持。

不适用的场景如下:

1)要求高度事务性的系统。 (但是现在已经提供事物处理机制了)

2)传统的商业智能应用。

3)复杂的跨文档(表)级联查询

mongodb数据丢失否

转载地址:https://blog.csdn.net/yibing548/article/details/50844310

MongoDB会先把数据更新写入到Journal Buffer里面然后再更新内存数据,然后再返回给应用端。Journal会以100ms的间隔批量刷到盘上。这样的情况下,即使出现断电数据尚未保存到文件,由于有Journal文件的存在,MongoDB会自动根据Journal里面的操作历史记录来对数据文件重新进行追加。

Journal文件是100ms 刷盘一次。那么要是系统掉电正好发生在上一次刷journal的50ms之后呢?这个时候,我们就可以来看一下MongoDB持久化的下一个概念了:写关注 写关注(Write Concern) 写关注(或翻译为写安全机制)是MongoDB特有的一个功能。它可以让你灵活地指定你写操作的持久化设定。这是一个在性能和可靠性之间的一个权衡。

MongoDB和MySQL选择

例如,许多电子商务应用程序使用MongoDB和MySQL的组合。产品目录包括具有不同属性的多个产品,非常适合MongoDB的灵活数据模型。另一方面,需要复杂事务的结帐系统可能建立在MySQL或其他关系数据库技术上。

什么是仲裁节点

经过大量血的教训,一个分片配置两个副本集时(一个是primary一个是secondary),如果primary挂掉,secondary是不会升级的,必须要加上一个不存储数据的仲裁节点

读写锁

当进行读操作的时候会加读锁,这个时候其他读操作可以也获得读锁。但是不能或者写锁。

当进行写操作的时候会加写锁,这个时候不能进行其他的读操作和写操作。

所以按照这个道理,是不会出现同时修改同一个文档(如执行++操作)导致数据出错的情况。

而且按照这个道理,因为写操作会阻塞读操作,所以是不会出现脏读的。

但是mongodb在分片和复制集的时候会产生脏读,后面在研究。

在3.0之后的版本,WiredTiger提供了文档(不是集合)级别的锁。

mogodb VS mysql

mogodb是无模式的文档数据库。

mysql mogodb 说明
database database 数据库/数据库
table collection 表/集合
row document 行/文档

区别

row

每一行都是一样的数据, 不可以添加不可以减少,也就是说fileds的个数在定义table的时候就一定申明好了。

document

他的每一个document都是独立的,同时也不是我们在create.collection的时候申明好的。

document

长度大小限制

mogodb天生就是分布式的,可扩展,高性能,遵循CAP。既然是分布式部署,存在两个问题,内存->粒度太多 网络带宽-> 多而碎, 他的长度是16M。redis的value是512M(String)

capped collection(上线集合)

转载地址:https://www.jianshu.com/p/86942c09094a

简介

  1. Capped集合是一个固定大小,高性能的,文档按照插入顺序的一个集合。 新的对象会把覆盖旧的对象,像环形缓存一样。
  2. find时默认就是插入的顺序,Capped集合会自动维护。
  3. Capped 集合用来解决top 多少的问题,最新的top条评论,最活跃的top用户…
  4. 一些日志的话, 或者是发送一些短信消息数量太大过多,存放时间不会太长,使用这个老的替换新的。 自动维护

指定这个collection的大小和document的数目。

Maximum size in bytes:  大小
Maximum number of documents: 数据

他相当于一个环形的队列, 新的document进来的时候,会替换掉老的document文档。

创建

db.createCollection("集合名称", { capped : true, size : num, max : num } )
db.createCollection("log", { capped : true, size : 1000, max : 5 } )
  1. size用来指定集合大小,单位KB
  2. 限制集合中对象的个数:可以在创建时设置max参数
  3. 指定mac数量的时候必须同时指定size容量。淘汰机制只有在容量还没有满时才会依据文档数量工作。要是容量满了,淘汰机制会依据容量来工作。

列子

设置最大是3个document:

db.getCollection("testcapped").insert({name:1})
db.getCollection("testcapped").insert({name:2})
db.getCollection("testcapped").insert({name:3})
db.getCollection("testcapped").insert({name:4})

然后查看这个collection

db.getCollection("testcapped").find();

{ 
    "_id" : ObjectId("5d7de039eae3e224578750ee"), 
    "name" : 2.0
}
// ----------------------------------------------
{ 
    "_id" : ObjectId("5d7de039eae3e224578750ef"), 
    "name" : 3.0
}
// ----------------------------------------------
{ 
    "_id" : ObjectId("5d7de039eae3e224578750f0"), 
    "name" : 4.0
}

可以看到最早插入的document已经被覆盖了。

API命令操作

#排序 
db.cappedCollection.find().sort( { $natural: -1 } ) 

#是否是上线集合
db.collection.isCapped()

#把普通集合转为上线集合
db.runCommand({"convertToCapped": "mycoll", size: 100000, max: 100});

bson

BSON是一种二进制序列化格式,用于存储文档并在MongoDB中进行远程过程调用。

支持的数据类型

Type Number Alias Notes
Double 1 “double”
String 2 “string”
Object 3 “object”
Array 4 “array”
Binary data 5 “binData”
Undefined 6 “undefined” Deprecated.
ObjectId 7 “objectId”
Boolean 8 “bool”
Date 9 “date”
Null 10 “null”
Regular Expression 11 “regex”
DBPointer 12 “dbPointer” Deprecated.
JavaScript 13 “javascript”
Symbol 14 “symbol” Deprecated.
JavaScript (with scope) 15 “javascriptWithScope”
32-bit integer 16 “int”
Timestamp 17 “timestamp”
64-bit integer 18 “long”
Decimal128 19 “decimal” New in version 3.4.
Min key -1 “minKey”
Max key 127 “maxKey”

$type运用

#查询password的类型是字符串的数据
db.getCollection("teacher").find({"password":{$type:2}})

注意:还可以通过正则表达式来处理数据。

名字空间(namespace)是什么?

MongoDB 存储 BSON 对象在丛集(collection)中。数据库名字和丛集名字以句点连结起来叫做名字空间(namespace)。

ObjectId

默认是document的主键, 默认索引。

12字节的ObjectId 值包括:

  • 一个4字节的值,表示自Unix纪元以来的秒数,
  • 一个5字节的随机值,和
  • 一个3字节的计数器,以随机值开始。

可以获取当前创建这个数据的时间

var createTime  = ObjectId("5d7de7d74374945f03b8b592").getTimestamp();
var year = createTime.getFullYear();  // 获取完整的年份(4位,1970)
var month = createTime.getMonth() + 1;  // 获取月份(0-11,0代表1月,用的时候记得加上1)
var date = createTime.getDate();  // 获取日(1-31)
var time = createTime.getTime();  // 获取时间(从1970.1.1开始的毫秒数)
var hours = createTime.getHours();  // 获取小时数(0-23)
var minutes = createTime.getMinutes();  // 获取分钟数(0-59)
var seconds = createTime.getSeconds();  // 获取秒数(0-59)
print(year+" "+month+" "+date+" "+time+" "+hours+" "+minutes+" "+seconds);

shell

mongodb是封装了一个V8引擎,**可以运行js代码的。**可以通过load(“js路径”)执行里面的mongdb的命令操作。

#shell启动位置
/bin/mongo

js写法

var mongo = new Mongo("localhost:27017");
var db = mongo.getDB("mydatabase"); 
var collection = db.getCollection("student");
var list = collection.find({}).toArray();
printjson(list);

「真诚赞赏,手留余香」

真诚赞赏,手留余香

使用微信扫描二维码完成支付