MongoDB 入门
1.1 数据库管理系统
在了解MongoDB之前需要先了解先数据库管理系统
1.1.1 什么是数据?
数据(英语:data),是指未经过处理的原始记录。
一般而言,数据缺乏组织及分类,无法明确的表达事物代表的意义,它可能是一堆的杂志、一大叠的报纸、数种的开会记录或是整本病人的病历纪录。数据描述事物的符号记录,是可定义为意义的实体,涉及事物的存在形式。是关于事件之一组离散且客观的事实描述,是构成讯息和知识的原始材料。
1.1.2 什么是数据库管理系统?
数据库管理系统(英语:database management system,缩写:DBMS) 是一种针对对象数据库,为管理数据库而设计的大型电脑软件管理系统。
具有代表性的数据管理系统有:Oracle、Microsoft SQL Server、Access、MySQL及PostgreSQL等。通常数据库管理师会使用数据库管理系统来创建数据库系统。
现代DBMS使用不同的数据库模型追踪实体、属性和关系。在个人电脑、大型计算机和主机上应用最广泛的数据库管理系统是关系型DBMS(relational DBMS)。在关系型数据模型中,用二维表格表示数据库中的数据。这些表格称为关系。
数据库管理系统主要分为俩大类:RDBMS、NOSQ
1.1.3 常见数据库管理系统?
常见的数据库管理系统,及其排名情况如下:
图 - 数据库管理系统使用情况世界排名
数据来源:DB-Engines Ranking - popularity ranking of database management systems
1.2 NoSQL是什么?
1.2.1 NoSQL简介
NoSQL是对不同于传统的关系数据库的数据库管理系统的统称。
两者存在许多显著的不同点,其中最重要的是NoSQL不使用SQL作为查询语言。其数据存储可以不需要固定的表格模式,也经常会避免使用SQL的JOIN操作,一般有水平可扩展性的特征。
NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。
2009年,Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论,来自Rackspace的Eric Evans再次提出了NoSQL的概念,这时的NoSQL主要指非关系型、分布式、不提供ACID的数据库设计模式。
2009年在亚特兰大举行的"no:sql(east)"讨论会是一个里程碑,其口号是"select fun, profit from real_world where relational=false;"。因此,对NoSQL最普遍的解释是“非关联型的”,强调Key-Value Stores和文档数据库的优点,而不是单纯的反对RDBMS。
基于2014年的收入,NoSQL市场领先企业是MarkLogic,MongoDB和Datastax。基于2015年的人气排名,最受欢迎的NoSQL数据库是MongoDB,Apache Cassandra和Redis.
1.2.2 NoSQL数据库四大家族
NoSQL中的四大家族主要是:列存储、键值、图像存储、文档存储,其类型产品主要有以下这些。
存储类型 | NoSQL | |
键值存储 | 最终一致性键值存储 | Cassandra、Dynamo、Riak、Hibari、Virtuoso、Voldemort |
内存键值存储 | Memcached、Redis、Oracle Coherence、NCache、 Hazelcast、Tuple space、Velocity | |
持久化键值存储 | BigTable、LevelDB、Tokyo Cabinet、Tarantool、TreapDB、Tuple space | |
文档存储 | MongoDB、CouchDB、SimpleDB、 Terrastore 、 BaseX 、Clusterpoint 、 Riak、No2DB | |
图存储 | FlockDB、DEX、Neo4J、AllegroGraph、InfiniteGraph、OrientDB、Pregel | |
列存储 | Hbase、Cassandra、Hypertable |
1.2.3 NoSQL的优势
高可扩展性、分布式计算、没有复杂的关系、低成本
架构灵活、半结构化数据
1.2.4 NoSQL与RDBMS对比
NoSQL | RDBMS |
代表着不仅仅是SQL 没有声明性查询语言 没有预定义的模式 键 - 值对存储,列存储,文档存储,图形数据库 最终一致性,而非ACID属性 非结构化和不可预知的数据 CAP定理 高性能,高可用性和可伸缩性 | 高度组织化结构化数据 结构化查询语言(SQL) (SQL) 数据和关系都存储在单独的表中。 数据操纵语言,数据定义语言 严格的一致性 基础事务 |
1.3 MongoDB简介
1.3.1 MongoDB是什么
MongoDB并非芒果的意思,而是源于 Humongous(巨大)一词。
1.3.2 MongoDB的特性
MongoDB的3大技术特色如下所示:
除了上图所示的还支持:
二级索引、动态查询、全文搜索 、聚合框架、MapReduce、GridFS、地理位置索引、内存引擎 、地理分布等一系列的强大功能。
但是其也有些许的缺点,例如:
多表关联: 仅仅支持Left Outer Join
SQL 语句支持: 查询为主,部分支持
多表原子事务: 不支持
多文档原子事务:不支持
16MB 文档大小限制,不支持中文排序 ,服务端 Javascript 性能欠佳
1.3.3 关系型数据库与mongodb对比
存储方式对比
在传统的关系型数据库中,存储方式是以表的形式存放,而在MongoDB中,以文档的形式存在。
数据库中的对应关系,及存储形式的说明
MongoDB与SQL的结构对比详解
SQL Terms/Concepts | MongoDB Terms/Concepts |
database | database |
table | collection |
row | document or BSON document |
column | field |
index | index |
table joins | embedded documents and linking |
primary key Specify any unique column or column combination as primary key. | primary key In MongoDB, the primary key is automatically set to the _id field. |
aggregation (e.g. group by) | aggregation pipeline See the SQL to Aggregation Mapping Chart. |
1.3.4 MongoDB数据存储格式
JSON格式
JSON 数据格式与语言无关,脱胎于 JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json。
MongoDB 使用JSON(JavaScript ObjectNotation)文档存储记录。
JSON数据库语句可以容易被解析。
Web 应用大量使用,NAME-VALUE 配对
BSON格式
BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。
二进制的JSON,JSON文档的二进制编码存储格式
BSON有JSON没有的Date和BinData
MongoDB中document以BSON形式存放
例如:
> db.meeting.insert({meeting:“M1 June",Date:"2018-01-06"});
1.3.5 MongoDB的优势
📢 MongoDB是开源产品
📢 On GitHub Url:https://github.com/mongodb
📢 Licensed under the AGPL,有开源的社区版本
📢 起源& 赞助by MongoDB公司,提供商业版licenses 许可
这些优势造就了mongodb的丰富的功能:
JSON 文档模型、动态的数据模式、二级索引强大、查询功能、自动分片、水平扩展、自动复制、高可用、文本搜索、企业级安全、聚合框架MapReduce、大文件存储GridFS
1.3.6 高可用的复制集群
自动复制和故障切换
多数据中心支持滚动维护无需关机支持最多50个成员
1.3.7 水平扩展
这种方式是目前构架上的主流形式,指的是通过增加服务器数量来对系统扩容。在这样的构架下,单台服务器的配置并不会很高,可能是配置比较低、很廉价的 PC,每台机器承载着系统的一个子集,所有机器服务器组成的集群会比单体服务器提供更强大、高效的系统容载量。
这样的问题是系统构架会比单体服务器复杂,搭建、维护都要求更高的技术背景。分片集群架构如下图所示:
1.3.8 各存储引擎的对比
MySQL InnoDB | MySQL NDB | Oracle | MongoDB MAPI | MongoDB WiredTiger | |
事务 | YES | YES | ES | NO | NO |
锁粒度 | ROW-level | ROW-level | ROW-level | Collection-level | Document-level |
Geospatial | YES | YES | YES | YES | YES |
MVCC | YES | NO | YES | NO | NO |
Replication | YES | YES | YES | YES | YES |
外键 | YES | YES(From 7.3) | YES | NO | NO |
数据库集群 | NO | YES | YES | YES | YES |
B-TREE索引 | YES | YES | YES | YES | YES |
全文检索 | YES | NO | YES | YES | YES |
数据压缩 | YES | NO | YES | NO | YES |
存储限制 | 64TB | 384EB | NO | NO | NO |
表分区 | YES | YES | YES | YES (分片) | YES (分片) |
1.3.9 数据库功能和性能对比
由下图可以看出MongoDB数据库的性能扩展能力及功能都较好,都能够在数据库中,站立一足之地。
1.3.10 MongoDB适用场景
网站数据、缓存等大尺寸、低价值的数据
在高伸缩性的场景,用于对象及JSON数据的存储。
1.3.11 MongoDB 慎用场景
慎用场景 | 原因 |
PB 数据持久存储大数据分析数据湖 | Hadoop、Spark提供更多分析运算功能和工具,并行计算能力更强 MongoDB + Hadoop/Spark |
搜索场景:文档有几十个字段,需要按照任意字段搜索并排序限制等 | 不建索引查询太慢,索引太多影响写入及更新操作 |
ERP、CRM或者类似复杂应用,几十上百个对象互相关联 | 关联支持较弱,事务较弱 |
需要参与远程事务,或者需要跨表,跨文档原子性更新的 | MongoDB 事务支持仅限于本机的单文档事务 |
100% 写可用:任何时间写入不能停 | MongoDB换主节点时候会有短暂的不可写设计所限 |
1.3.12 什么时候该MongDB
应用特征 | Yes/No? |
我的数据量是有亿万级或者需要不断扩容 | |
需要2000-3000以上的读写每秒 | |
新应用,需求会变,数据模型无法确定 | |
我需要整合多个外部数据源 | |
我的系统需要99.999%高可用 | |
我的系统需要大量的地理位置查询 | |
我的系统需要提供最小的latency | |
我要管理的主要数据对象<10 |
在上面的表格中进行选择,但有1个yes的时候:可以考虑MongoDB;当有2个以上yes的时候:不会后悔的选择!
1.4 MongoDB的部署
MongoDB官网:MongoDB: The Developer Data Platform | MongoDB
CentOS6.X版本软件下载地址:Try MongoDB Atlas Products | MongoDB
其他版本请到进行官网下载。
1.4.1 安装前准备
在安装之前首先确认该版本软件是否支持你的操作系统。
更多详情查看:Install MongoDB — MongoDB Manual
Platform | 3.6 Community & Enterprise | 3.4 Community & Enterprise | 3.2 Community & Enterprise | 3.0 Community & Enterprise |
RHEL/CentOS 6.2 and later | ✓ | ✓ | ✓ | ✓ |
RHEL/CentOS 7.0 and later | ✓ | ✓ | ✓ | ✓ |
1.4.2 环境说明
系统环境说明:
[root@MongoDB ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@MongoDB ~]# uname -r
2.6.32-696.el6.x86_64
[root@MongoDB ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
[root@MongoDB ~]# getenforce
Disabled
[root@MongoDB ~]# hostname -I
10.0.0.152 172.16.1.152
软件版本说明
本次使用的mongodb版本为:mongodb-linux-x86_64-3.2.8.tgz
1.4.3 部署MongoDB
在root用户下操作
cat >> /etc/rc.local <<'EOF'
if test -f /sys/kernel/mm/transparent_hugepage/enabled; thenecho never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; thenecho never > /sys/kernel/mm/transparent_hugepage/defrag
fi
EOF
该方法仅限与CentOS系统使用,其他系统关闭参照官方文档: Disable Transparent Huge Pages (THP) — MongoDB Manual
Transparent Huge Pages (THP),通过使用更大的内存页面,可以减少具有大量内存的机器上的缓冲区(TLB)查找的开销。
但是,数据库工作负载通常对THP表现不佳,因为它们往往具有稀疏而不是连续的内存访问模式。您应该在Linux机器上禁用THP,以确保MongoDB的最佳性能。
创建用户
groupadd -g 800 mongod
useradd -u 801 -g mongod mongod
修改用户密码
echo 123456 |passwd --stdin mongod
创建程序目录
mkdir -p /application/mongodb/ &&\
cd /application/mongodb/ &&\
mkdir -p bin conf log data
下载程序
cd /application/mongodb/
wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.8.tgz
解压程序
tar xf mongodb-linux-x86_64-3.2.8.tgz
cd mongodb-linux-x86_64-3.2.8/bin/ &&\
cp * /mongodb/bin
修改程序属主
chown -R mongod:mongod /application/mongodb
切换到mongod用户,设置用户环境变量
su - mongod
cat >> .bash_profile <<'EOF'
export PATH=/mongodb/bin:$PATH
EOF
source .bashprofile
至此,MongoDB数据库部署完成
1.4.4 管理MongoDB
数据库的启动与关闭
启动:mongod --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork
关闭:mongod --shutdown --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork
参数说明:
参数 | 参数说明 |
--dbpath | 数据存放路径 |
--logpath | 日志文件路径 |
--logappend | 日志输出方式 |
--port | 启用端口号 |
--fork | 在后台运行 |
--auth | 是否需要验证权限登录(用户名和密码) |
--bind_ip | 限制访问的ip |
--shutdown | 关闭数据库 |
登入数据库
[mongod@MongoDB ~]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
>
使用配置文件的方式管理数据库:
普通格式配置文件:
cd /application/mongodb/conf/
[mongod@MongoDB conf]$ vim mongod1.conf
dbpath=/application/mongodb/data
logpath=/application/mongodb/log/mongodb.log
port=27017
logappend=1
fork=1
使用配置文件时的启动与关闭:
启动:mongod -f mongod1.conf
关闭:mongod -f mongod1.conf --shutdown
YAML格式配置文件(3.X 版本官方推荐使用)
[mongod@MongoDB conf]$ cat mongod.conf
systemLog:destination: filepath: "/application/mongodb/log/mongod.log"logAppend: true
storage:journal:enabled: truedbPath: "/application/mongodb/data"
processManagement:fork: true
net:port: 27017
在数据库中关闭数据库的方法
shell > mongo
[mongod@MongoDB conf]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
> db.shutdownServer()
shutdown command only works with the admin database; try 'use admin'
> use admin
> db.shutdownServer()
server should be down...
注:
mongod进程收到SIGINT信号或者SIGTERM信号,会做一些处理
> 关闭所有打开的连接
> 将内存数据强制刷新到磁盘
> 当前的操作执行完毕
> 安全停止
切忌kill -9
数据库直接关闭,数据丢失,数据文件损失,修复数据库(成本高,有风险)
使用kill命令关闭进程
$ kill -2 PID原理:-2表示向mongod进程发送SIGINT信号。
或
$ kill -4 PID原理:-4表示向mognod进程发送SIGTERM信号。
使用脚本管理mongodb服务
注:该脚本可以直接在root用户下运行
1.5 MongoDB的基本操作
Mongodb中关键字种类:
db(数据库实例级别)
db本身
db.connection 数据库下的集合信息
db.collection.xxx(
rs(复制集级别)
sh(分片级别)
1.5.1 查询操作
在客户端指定数据库进行连接:(默认连接本机test数据库)
[mongod@MongoDB ~]$ mongo 10.0.0.152/admin
MongoDB shell version: 3.2.8
connecting to: 10.0.0.152/admin
> db
admin
查看当前数据库版本
> db.version()
3.2.8
切换数据库
> use test;
switched to db test
显示当前数据库
> db
test
> db.getName()
test
查询所有数据库
> show dbs;
clsn 0.000GB
local 0.000GB
test 0.000GB
> show databases;
clsn 0.000GB
local 0.000GB
test 0.000GB
查看clsn数据库当前状态
> use clsn;
> db.stats()
{"db" : "clsn","collections" : 1,"objects" : 10000,"avgObjSize" : 80,"dataSize" : 800000,"storageSize" : 258048,"numExtents" : 0,"indexes" : 1,"indexSize" : 94208,"ok" : 1
}
查看当前数据库的连接机器地址
> db.getMongo()
connection to 127.0.0.1
1.5.2 数据管理
创建数据库
> use clsn;
说明:
创建数据库:
当use的时候,系统就会自动创建一个数据库。
如果use之后没有创建任何集合。系统就会删除这个数据库。
删除数据库
> show dbs;
clsn 0.000GB
local 0.000GB
test 0.000GB
> use clsn
switched to db clsn
> db.dropDatabase()
{ "dropped" : "clsn", "ok" : 1 }
说明:
删除数据库:
如果没有选择任何数据库,会删除默认的test数据库
创建集合
方法一:
> use clsn;
switched to db clsn
> db.createCollection('a')
{ "ok" : 1 }
> db.createCollection('b')
{ "ok" : 1 }
查看当前数据下的所有集合
> show collections;
a
b
> db.getCollectionNames()
[ "a", "b" ]
方法二:
当插入一个文档的时候,一个集合就会自动创建。
> use clsn;
switched to db clsn
> db.c.insert({name:'clsn'});
WriteResult({ "nInserted" : 1 })
> db.c.insert({url:'http://blog.nmtui.com'});
WriteResult({ "nInserted" : 1 })
查看创建的合集
> db.getCollectionNames()
[ "a", "b", "c" ]
查看合集里的内容
> db.c.find()
{ "_id" : ObjectId("5a4cbcea83ec78b7bea904f8"), "name" : "clsn" }
{ "_id" : ObjectId("5a4cbcfc83ec78b7bea904f9"), "url" : "http://blog.nmtui.com" }
重命名集合
> db.c.renameCollection("clsn")
{ "ok" : 1 }
> db.getCollectionNames()
[ "a", "b", "clsn" ]
删除合集
> db.a.drop()
true
> db.getCollectionNames()
[ "b", "clsn" ]
插入1w行数据
> for(i=0;i<10000;i++){ db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()}); }
WriteResult({ "nInserted" : 1 })
查询集合中的查询所有记录
> db.log.find()
注:默认每页显示20条记录,当显示不下的的情况下,可以用it迭代命令查询下一页数据。
> DBQuery.shellBatchSize=50; # 每页显示50条记录
50
app> db.log.findOne() # 查看第1条记录
app> db.log.count() # 查询总的记录数
app> db.log.find({uid:1000}); # 查询UUID为1000的数据
删除集合中的记录数
> db.log.distinct("name") # 查询去掉当前集合中某列的重复数据
[ "mongodb" ]
> db.log.remove({}) # 删除集合中所有记录
WriteResult({ "nRemoved" : 10000 })
> db.log.distinct("name")
[ ]
查看集合存储信息
> db.log.stats() # 查看数据状态
> db.log.dataSize() # 集合中数据的原始大小
> db.log.totalIndexSize() # 集合中索引数据的原始大小
> db.log.totalSize() # 集合中索引+数据压缩存储之后的大小
> db.log.storageSize() # 集合中数据压缩存储的大小
pretty()使用
> db.log.find({uid:1000}).pretty()
{"_id" : ObjectId("5a4c5c0bdf067ab57602f7c2"),"uid" : 1000,"name" : "mongodb","age" : 6,"date" : ISODate("2018-01-03T04:28:59.343Z")
}
1.6 MongoDB中用户管理
MongoDB数据库默认是没有用户名及密码的,即无权限访问限制。为了方便数据库的管理和安全,需创建数据库用户。
1.6.1 用户的权限
用户中权限的说明
权限 | 说明 |
Read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile |
userAdmin | 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 |
clusterAdmin | 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。 |
readAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读权限 |
readWriteAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读写权限 |
userAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 |
dbAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 |
root | 只在admin数据库中可用。超级账号,超级权限 |
更多关于用户权限的说明参照:https://docs.mongodb.com/manual/core/security-built-in-roles/
用户创建语法
{
user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>",
db: "<database>" } | "<role>",
...
]
}
语法说明:
user字段:用户的名字;
pwd字段:用户的密码;
cusomData字段:为任意内容,例如可以为用户全名介绍;
roles字段:指定用户的角色,可以用一个空数组给新用户设定空角色;
roles 字段:可以指定内置角色和用户定义的角色。
1.6.2 创建管理员用户
进入管理数据库
> use admin
创建管理用户,root权限
db.createUser({user: "root",pwd: "root",roles: [ { role: "root", db: "admin" } ]}
)
注意:
创建管理员角色用户的时候,必须到admin下创建。
删除的时候也要到相应的库下操作。
查看创建完用户后的collections;
> show tables;
system.users # 用户存放位置
system.version
查看创建的管理员用户
> show users{"_id" : "admin.root","user" : "root","db" : "admin","roles" : [{"role" : "root","db" : "admin"}]}
验证用户是否能用
> db.auth("root","root")
1 # 返回 1 即为成功
用户创建完成后在配置文件中开启用户验证
cat >>/application/mongodb/conf/mongod.conf<<-'EOF'
security:authorization: enabled
EOF
重启服务
/etc/init.d/mongod restart
登陆测试,注意登陆时选择admin数据库
注意:用户在哪个数据库下创建的,最后加上什么库。
方法一:命令行中进行登陆
[mongod@MongoDB ~]$ mongo -uroot -proot admin
MongoDB shell version: 3.2.8
connecting to: admin
>
方法二:在数据库中进行登陆验证:
[mongod@MongoDB ~]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
> use admin
switched to db admin
> db.auth("root","root")
1
> show tables;
system.users
system.version
1.6.3 按生产需求创建应用用户
创建对某库的只读用户
在test库创建只读用户test
use test
db.createUser({user: "test",pwd: "test",roles: [ { role: "read", db: "test" } ]}
)
测试用户是否创建成功
db.auth("test","test")
show users;
登录test用户,并测试是否只读
show collections;
db.createCollection('b')
创建某库的读写用户
创建test1用户,权限为读写
db.createUser({user: "test1",pwd: "test1",roles: [ { role: "readWrite", db: "test" } ]}
)
查看并测试用户
show users;
db.auth("test1","test1")
创建对多库不同权限的用户
创建对app为读写权限,对test库为只读权限的用户
use app
db.createUser({user: "app",pwd: "app",
roles: [ { role: "readWrite", db: "app" },{ role: "read", db: "test" }]}
)
查看并测试用户
show users
db.auth("app","app")
删除用户
删除app用户:先登录到admin数据库
mongo -uroot –proot 127.0.0.1/admin
进入app库删除app用户
use app
db.dropUser("app")
1.6.4 自定义数据库
创建app数据库的管理员:先登录到admin数据库
use app
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [ { role: "dbAdmin", db: "app" } ]
}
)
创建app数据库读写权限的用户并具有clusterAdmin权限:
use app
db.createUser(
{
user: "app04",
pwd: "app04",
roles: [ { role: "readWrite", db: "app" },
{ role: "clusterAdmin", db: "admin" }
]
}
)
1.7 SQL与MongoDB语言对比
SQL语言与CRUD语言对照
SQL Schema Statements | MongoDB Schema Statements |
CREATE TABLE users ( id MEDIUMINT NOT NULL AUTO_INCREMENT, user_id Varchar(30), age Number, status char(1), PRIMARY KEY (id) ) | Implicitly created on first insert() operation. The primary key _idis automatically added if _id field is not specified. db.users.insert( { user_id: "abc123", age: 55, status: "A" } ) However, you can also explicitly create a collection: db.createCollection("users") |
ALTER TABLE users ADD join_date DATETIME | 在Collection 级没有数据结构概念。然而在 document级,可以通过$set在 update操作添加列到文档中。 db.users.update( { }, { $set: { join_date: new Date() } }, { multi: true } ) |
ALTER TABLE users DROP COLUMN join_date | 在Collection 级没有数据结构概念。然而在 document级,可以通过$unset 在update操作从文档中删除列。 db.users.update( { }, { $unset: { join_date: "" } }, { multi: true } ) |
CREATE INDEX idx_user_id_asc ON users(user_id) | db.users.createIndex( { user_id: 1 } ) |
CREATE INDEX idx_user_id_asc_age_desc ON users(user_id, age DESC) | db.users.createIndex( { user_id: 1, age: -1 } ) |
DROP TABLE users | db.users.drop() |
插入/删除/更新 语句对比
SQL Statements | MongoDB Statements |
INSERT INTO users(user_id, age status) VALUES ("bcd001", 45, "A") | db.users.insert( { user_id: "bcd001", age: 45, status: "A" } ) |
DELETE FROM users WHERE status = "D" | db.users.remove( { status: "D" } ) |
DELETE FROM users | db.users.remove({}) |
UPDATE users SET status = "C" WHERE age > 25 | db.users.update( { age: { $gt: 25 } }, { $set: { status: "C" } }, { multi: true } ) |
UPDATE users SET age = age + 3 WHERE status = "A" | db.users.update( { status: "A" } , { $inc: { age: 3 } }, { multi: true } ) |
查询类操作对比
SQL SELECT Statements | MongoDB find() Statements |
SELECT * FROM users | db.users.find() |
SELECT id, user_id, status FROM users | db.users.find( { }, { user_id: 1, status: 1, _id: 0 } ) |
SELECT user_id, status FROM users | db.users.find( { }, { user_id: 1, status: 1 } ) |
SELECT * FROM users WHERE status = "A" | db.users.find( { status: "A" } ) |
SELECT user_id, status FROM users WHERE status = "A" | db.users.find( { status: "A" }, { user_id: 1, status: 1, _id: 0 } ) |
1.8 错误解决
在登陆数据库的时候,发现会由描述文件相关的报错。
[mongod@MongoDB mongodb]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
Server has startup warnings:
2018-01-03T11:08:55.526+0800 I CONTROL [initandlisten]
2018-01-03T11:08:55.526+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 19193 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.
解决办法:
cat >> /etc/security/limits.conf <<EOF
mongod soft nofile 32767.5
mongod soft nproc 32767.5
EOF
修改后,重启服务器,即可解决该问题。
惨绿少年
相关文章:

MongoDB 入门
1.1 数据库管理系统 在了解MongoDB之前需要先了解先数据库管理系统 1.1.1 什么是数据? 数据(英语:data),是指未经过处理的原始记录。 一般而言,数据缺乏组织及分类,无法明确的表达事物代表的意…...

使用uni-app的uniCloud 云数据库入门:实现一个简单的增删改查
官方云数据库文档 前置步骤使用uni-app新建一个uniCloud项目 [外链图片转存失败,源站可能有防盗官方云数据库文档]!链机制,建议将()https://uniapp.dcloud.net.cn/uniCloud/hellodb.html)] 新建表 这里我加了几个测试字段 createTime、remark、money // 文档教程: https://un…...

【MATLAB第64期】【保姆级教程】基于MATLAB的SOBOL全局敏感性分析模型运用(含无目标函数,考虑代理模型)
【MATLAB第64期】【保姆级教程】基于MATLAB的SOBOL全局敏感性分析模型运用(含无目标函数,考虑代理模型) 版本更新: 2023/8/5: 1.因BP作为代理模型不稳定,经过测试,libsvm比rf /bp 效果稳定且精…...

Python web实战之Django用户认证详解
关键词: Python Web 开发、Django、用户认证、实战案例 概要 今天来探讨一下 Django 的用户认证吧!在这篇文章中,我将为大家带来一些有关 Django 用户认证的最佳实践。 1. Django 用户认证 在开发 Web 应用程序时,用户认证是一个…...

每天五分钟机器学习:梯度下降算法和正规方程的比较
本文重点 梯度下降算法和正规方程是两种常用的机器学习算法,用于求解线性回归问题。它们各自有一些优点和缺点,下面将分别对它们进行详细的讨论。 区别 1. 梯度下降算法是一种迭代的优化算法,通过不断迭代调整参数来逼近最优解。它的基本思想是根据目标函数的梯度方向,沿…...

生信学院|08月18日《基于Flow Simulation的冷链运输产品案例》
课程主题:基于Flow Simulation的冷链运输产品案例 课程时间:2023年08月18日 14:00-14:30 主讲人:江流洋 生信科技 CAE专家 1、达索仿真方案介绍 2、项目介绍 3、案例分析 请安装腾讯会议客户端或APP,微信扫描海报中的二维码…...

不可错过的家装服务预约小程序商城开发指南
在当今社会,家装行业发展迅速,越来越多的人开始寻求专业的家装预约和咨询服务。对于不懂技术的新手来说,创建一个自己的家装预约咨询平台可能听起来很困难,但实际上通过一些第三方制作平台和工具,这个过程可以变得简单…...

任务 13、MidJourney种子激发极致创作,绘制震撼连贯画作
13.1 任务概述 通过本次实验任务,学员将深入了解Midjourney种子的概念和重要性,以及种子对生成图像的影响。他们将学会在Midjourney平台中设置种子值并调整其参数,以达到所需的效果。此外,任务还详细介绍了Midjourney V4.0版本中…...

IAR开发环境的安装、配置和新建STM32工程模板
IAR到环境配置到新建工程模板-以STM32为例 一、 简单介绍一下IAR软件1. IAR的安装(1) 下载IAR集成开发环境安装文件(2) 安装 2. 软件注册授权 二、IAR上手使用(基于STM32标准库新建工程)1、下载标准库文件2、在IAR新建工程&#x…...

FPGA优质开源项目 – PCIE通信
本文介绍一个FPGA开源项目:PCIE通信。该工程围绕Vivado软件中提供的PCIE通信IP核XDMA IP建立。Xilinx提供了XDMA的开源驱动程序,可在Windows系统或者Linux系统下使用,因此采用XDMA IP进行PCIE通信是比较简单直接的。 本文主要介绍一下XDMA I…...

NLP:长文本场景下段落分割(文本分割、Text segmentation)算法实践----一种结合自适应滑窗的文本分割序列模型
NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等 专栏详细介绍:NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型…...
商汤科技2021校招-开发大类B卷
笔试时间:2020.09.18,19:00——21:00 岗位:嵌入式软件工程师 题型:单选4道,不定项选择题2道,填空2道,编程2道。 1、单选 1、在一棵二叉树上第5层的结点数最多是:16 第1层1个 2^0 第2层2个 2^1 第3层4个 2^2 第n层 2^(n-1...

陪诊小程序开发|陪诊系统定制|数字化医疗改善就医条件
健康问题这几年成为人们关注的焦点之一,然而看病却是一个非常麻烦的过程,特别是对于那些身处陌生城市或者不熟悉就医流程的人来说。幸运的是现在有了陪诊小程序下,为您提供便捷的助医服务,使得就医过程得更加简单和轻松。 陪诊系统…...

stable diffusion(1): webui的本地部署(windows)
一、前言 是的,现在是202308月份了,网上已经有很多打包好的工具,或者直接进一个web就能用SD的功能,但是我们作为程序员,就应该去躺坑,这样做也是为了能够有更多自主操作的空间。 像其他AI一样,…...

(树) 剑指 Offer 36. 二叉搜索树与双向链表 ——【Leetcode每日一题】
❓ 剑指 Offer 36. 二叉搜索树与双向链表 难度:中等 输入一棵二叉搜索树,将该二叉搜索树转换成一个 排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为…...
TypeScript初学
文章转载:https://blog.csdn.net/weixin_46185369/article/details/121512287 写的很详细,适合初学者看看。 一、TypeScript是什么? 1.TypeScript简称:TS,是JavaScript的超集。简单来说就是:JS有的TS都有…...
C/C++预定义宏
MSVC文档: https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?viewmsvc-170 GCC文档: https://gcc.gnu.org/onlinedocs/gcc/Function-Names.html https://gcc.gnu.org/onlinedocs/cpp/Predefined-Macros.html 参考:…...
原型链污染挖掘(存储XSS)
服务XSS响应 将JSON content-type更改为HTML 在Express应用中使用 JSON内容类型响应 并反映一个JSON: app.use(bodyParser.json({type: application/json})); app.post(/, function(req, res){_.merge({}, req.body);res.send(req.body); }); 在这些情况下&…...

Chrome开发者工具介绍
Chrome开发者工具介绍 前言1 打开DevTools2 命令菜单3 Elements面板ConsoleJavaScript调试Network 前言 Chrome开发者工具是谷歌浏览器自带的一款开发者工具,它可以给开发者带来很大的便利。常用的开发者工具面板主要包含Elements面板、Console面板、Sources面板、…...

利用MMPose进行姿态估计(训练、测试全流程)
前言 MMPose是一款基于PyTorch的姿态分析开源工具箱,是OpenMMLab项目成员之一,主要特性: 支持多种人体姿态分析相关任务:2D多人姿态估计、2D手部姿态估计、动物关键点检测等等更高的精度和更快的速度:包括“自顶向下”…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...