MongoDB 入门教学贴 从术语到操作 (约束怎么建立 内部培训贴)

文摘   2024-07-31 06:02   法国  

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2330人左右 1 + 2 + 3 + 4 +5 + 6 + 7)(1 2 3 4 5 群均已爆满,请不要在问有没有位置谢谢)

最近由于某些原因,要培训两个非MongoDB 的DBA掌握MongoDB的一些知识,好投入战斗,想着写教案的时候,还不如写一个入门贴。

什么是MongoDB: MongoDB  是一款高性能的分布式存储可进行横向扩展的自带高可用协议和功能的存储数据以Json格式数据为主的数据库产品,客户可以选择的产品主要有三种,1 开源产品 2 付费企业级的数据库 3 MongoDB Atlas 

国内一般在使用产品的时候,多使用的是开源的产品,在数据的一些特殊功能方面有一些缺失,相对于企业版的数据库产品。

我们直接说,企业版多了什么功能,主要功能在审计和 in-memory引擎

In-Memory Storage Engine
Auditing
Kerberos Authentication
LDAP Proxy Authentication and LDAP Authorization
Encryption at Rest

所以对于审计功能有要求的可以考虑购买企业版的MongoDB.


MongoDB 中的一些术语和知识

1  表不叫表,叫collection 集合

2  行不叫行 ,称为document

3  在一行里面或者在一个doucument 里面会存在 key-value pairs, 这里我们称之为 fields and values .

4   replica set 副本集:在MongoDB,生产数据库是不允许单机呈现的,因为会出现数据安全性的问题,所以在生产环境中,应该是至少3节点的模式来进行数据库的安装和呈现的。

5   WiredTiger:  WiredTiger 是MongoDB的数据库处理引擎,与MySQL innodb 类似,也是第三方开发的数据库引擎,在MongoDB 上使用,最早的MongoDB的数据库引擎不是 wiredTiger ,WiredTiger 数据库引擎彻底改变了MongoDB 的一些数据处理方式和性能。

6 _id 与其他的数据库不同,在MongoDB 是自己产生主键,我们称之为object_id,这里我们建议,不要自定义主键,而是要使用object_id , 在MongoDB 中表达为_id

7  Schema  无模式,这里MongoDB 的数据组成方式并不是和传统数据库一样,而是可以每一行与每一行的数据组成的构成都可以不一样,但这里不建议这样进行设计。同时MongoDB 中也有约束,可以通过约束来指定文档中的结构。

8  Index ,与传统数据库类似,MongoDB中也存在索引,但使用的方式与类型与传统数据库略有不同,在属性上也有一些区别.

9  慢查询:在一些数据库中的慢查询以秒来计算,在MongoDB中的慢查询相对传统数据库维度要更小一点,比如一般慢查询的阀值在 500毫秒等

10  聚合:在MongoDB中也是可以对数据进行类似传统数据库的聚合操作的,有相关的一些语句的写法来进行相关的操作。


基本命令:

1  建立或打开一个数据库,这里注意,在MongoDB里面没有建库的命令,如果要建立或打开一个数据库,都用use 命令即可

> use test
switched to db test


> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB

> db
test
> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB


2  建表 在mongoDB 中可以没有建表语句,通过插入数据的方式直接产生一张collection

> use test
switched to db test


> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB

> db
test
> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB



> db.myCollection.insertOne({
...   name: "Alice",
...   age: 30,
...   address: {
...     street: "123 Main St",
...     city: "Springfield"
...   },
...   hobbies: ["reading""hiking""coding"]
... })
{
 "acknowledged" : true,
 "insertedId" : ObjectId("61f8080cfa8251f3e6306e27")
}
> show collections;
myCollection



是否可以创建一个带有约束的MongoDB的collection,是可以可以的,比如下面这个例子。

这个例子中,限制了一个名字叫myCollection 的集合,里面限制了在文档中必须包含 name 和 age 两个并且要求,name必须是string类型的而age必须是 int 类型的。

db.createCollection("myCollection", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name""age"],
      properties: {
        name: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        age: {
          bsonType: "int",
          minimum: 18,
          description: "must be an integer and is required"
        }
      }
    }
  }
})

然后我们尝试在里面插入数据,失败,原因是 age中的数据被认为是double类型的所以插入失败。

> db.myCollection.insertOne({
...   name: "Charlie",
...   age: 19,
...   address: {
...     street: "789 Pine St",
...     city: "Springfield"
...   },
...   hobbies: ["gaming""swimming"]
... })
WriteError({
 "index" : 0,
 "code" : 121,
 "errmsg" : "Document failed validation",
 "op" : {
  "_id" : ObjectId("61f80d1efa8251f3e6306e2e"),
  "name" : "Charlie",
  "age" : 19,
  "address" : {
   "street" : "789 Pine St",
   "city" : "Springfield"
  },
  "hobbies" : [
   "gaming",
   "swimming"
  ]
 },
 "errInfo" : {
  "failingDocumentId" : ObjectId("61f80d1efa8251f3e6306e2e"),
  "details" : {
   "operatorName" : "$jsonSchema",
   "schemaRulesNotSatisfied" : [
    {
     "operatorName" : "properties",
     "propertiesNotSatisfied" : [
      {
       "propertyName" : "age",
       "details" : [
        {
         "operatorName" : "bsonType",
         "specifiedAs" : {
          "bsonType" : "int"
         },
         "reason" : "type did not match",
         "consideredValue" : 19,
         "consideredType" : "double"
        }
       ]
      }
     ]
    }
   ]
  }
 }
}) :
WriteError({
 "index" : 0,
 "code" : 121,
 "errmsg" : "Document failed validation",
 "op" : {
  "_id" : ObjectId("61f80d1efa8251f3e6306e2e"),
  "name" : "Charlie",
  "age" : 19,
  "address" : {
   "street" : "789 Pine St",
   "city" : "Springfield"
  },
  "hobbies" : [
   "gaming",
   "swimming"
  ]
 },
 "errInfo" : {
  "failingDocumentId" : ObjectId("61f80d1efa8251f3e6306e2e"),
  "details" : {
   "operatorName" : "$jsonSchema",
   "schemaRulesNotSatisfied" : [
    {
     "operatorName" : "properties",
     "propertiesNotSatisfied" : [
      {
       "propertyName" : "age",
       "details" : [
        {
         "operatorName" : "bsonType",
         "specifiedAs" : {
          "bsonType" : "int"
         },
         "reason" : "type did not match",
         "consideredValue" : 19,
         "consideredType" : "double"
        }
       ]
      }
     ]
    }
   ]
  }
 }
})
WriteError@src/mongo/shell/bulk_api.js:465:48
mergeBatchResults@src/mongo/shell/bulk_api.js:871:49
executeBatch@src/mongo/shell/bulk_api.js:940:13
Bulk/this.execute@src/mongo/shell/bulk_api.js:1182:21
DBCollection.prototype.insertOne@src/mongo/shell/crud_api.js:264:9
@(shell):1:1


在我们标记好相关的数字的类型后,数据可以插入。

> db.myCollection.insertOne({
...   name: "Charlie",
...   age: NumberInt(19),
...   address: {
...     street: "789 Pine St",
...     city: "Springfield"
...   },
...   hobbies: ["gaming""swimming"]
... })
{
 "acknowledged" : true,
 "insertedId" : ObjectId("61f8109cfa8251f3e6306e2f")
}


所以MongoDB中是可以进行相关的无结构的文档的约束设计的,也就是在无结构中可以保证有些结构是存在的,并且值也是要符合要求的。

今天就先写到这里,后面继续...


置顶文章

你有发表论点的自由,我们DBA有屏蔽你封杀你的自由
MySQL 8.0x 到 9.0均可能崩溃--云厂商开发指责 MYSQL不测试就推新版本?
MongoDB 入门教学贴 从术语到操作 (用户权限 内部培训贴)
MongoDB 入门教学贴 单机的安装与设置 (内部培训贴)
MongoDB  聚合怎么写,更复杂的聚合案例
MongoDB 谨献给说MongoDB 这不好那不好的“古董”  -- 发展与演进,从3 到 7 的卓越变化


往期热门文章:

PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆

MySQL 让你还用5.7 出事了吧,用着用着5.7崩了

临时工访谈:问金融软件开发总监  哪些业务不用传统数据库
PolarDB  Serverless POC测试中有没有坑与发现的疑问
临时工访谈:PolarDB  Serverless  发现“大”问题了  之 灭妖记 续集
临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一
PolarDB for PostgreSQL  有意思吗?有意思呀
PolarDB  Serverless POC测试中有没有坑与发现的疑问

MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验

临时工访谈:从国产数据库 到 普罗大众的产品 !与在美国创业软件公司老板对话

PostgreSQL 如何通过工具来分析PG 内存泄露

MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验
临时工访谈:我很普通,但我也有生存的权利,大龄程序员 求职贴
临时工说: 快速识别 “海洋贝壳类” 数据库方法速递
临时工说:国产 数据库 销售人员  图鉴
临时工说:DBA 是不是阻碍国产数据库发展的毒瘤 ,是不是?从国产DB老专家的一条留言开始 (其实更好看的是文章下方的留言)

感谢 老虎刘 刘老师 对 5月20日 SQL 问题纠正贴 ---PostgreSQL 同一种SQL为什么这样写会提升45%性能

PostgreSQL 同一种SQL为什么这样写会提升45%性能 --程序员和DBA思维方式不同决定

MongoDB 不是软柿子,想替换就替换

PostgreSQL  熊灿灿一句话够学半个月 之 KILL -9

MongoDB  挑战传统数据库聚合查询,干不死他们的

临时工说:国内数据库企业存活   “三板斧”

临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一  (阿里云组团PK笔者实录

临时工访谈:金牌 “女” 销售从ORACLE 转到另类国产数据库 到底  为什么?

临时工访谈:无名氏意外到访-- 也祝你好运(管理者PUA DBA现场直播)

临时工说:搞数据库 光凭的是技术,那DBA的死多少次?

PostgreSQL  分组查询可以不进行全表扫描吗?速度提高上千倍?
临时工说:分析当前经济形势下 DBA 被裁员的根因
PostgreSQL PG_DUMP 工作失败了怎么回事及如何处理
MySQL 八怪(高老师)现场解决问题实录
PostgreSQL 为什么也不建议 RR隔离级别,MySQL别笑
临时工访谈:OceanBase上海开大会,我们四个开小会 OB 国产数据库破局者
临时工说:OceanBase 到访,果然数据库的世界很卷,没边
临时工访谈:恶意裁员后,一个国产数据库企业程序员的心声
临时工说:上云后给 我一个 不裁 DBA的理由
PolarDB for PostgreSQL  有意思吗?有意思呀
PostgreSQL   玩PG我们是认真的,vacuum 稳定性平台我们有了
临时工说:裁员裁到 DBA 咋办  临时工教你 套路1 2 3
PolarDB  搞那么多复杂磁盘计费的东西,抽筋了吗?
临时工说:OceanBase 到访,果然数据库的世界很卷,没边
MONGODB  ---- Austindatabases  历年文章合集
MYSQL  --Austindatabases 历年文章合集
POSTGRESQL --Austindatabaes 历年文章整理
POLARDB  -- Ausitndatabases 历年的文章集合
PostgreSQL  查询语句开发写不好是必然,不是PG的锅
SQL SERVER 如何实现UNDO REDO  和PostgreSQL 有近亲关系吗
MongoDB 2023纽约 MongoDB 大会 -- 我们怎么做的新一代引擎 SBE Mongodb 7.0双擎力量(译)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
MongoDB  双机热备那篇文章是  “毒”
MongoDB   会丢数据吗?在次补刀MongoDB  双机热备
临时工说:从人性的角度来分析为什么公司内MySQL 成为少数派,PolarDB 占领高处
POLARDB  到底打倒了谁  PPT 分享 (文字版)
PostgreSQL  字符集乌龙导致数据查询排序的问题,与 MySQL 稳定 "PG不稳定"
PostgreSQL  Patroni 3.0 新功能规划 2023年 纽约PG 大会 (音译)

Austindatabases 公众号,主要围绕数据库技术(PostgreSQL, MySQL, Mongodb, Redis, SqlServer,PolarDB, Oceanbase 等)和职业发展,国外数据库大会音译,国外大型IT信息类网站文章翻译,等,希望能和您共同发展。





AustinDatabases
关于数据库相关的知识分享
 最新文章