MongoDB介绍与基础语法
官网: Download MongoDB Community Server
gui客户端工具mongo compass: MongoDB Compass
java客户端版本对比: Compatibility — Java Sync
客户端及api操作: https://www.mongodb.com/docs/drivers/java/sync/current/quick-reference/
命令api: mongosh Methods — MongoDB Manual
redis与mongoDB对比
项目 | Redis | MongoDB | 比较说明 |
介绍 | Redis 是内存中的数据结构存储,用作数据库,缓存和消息代理。 | MongoDB 是遵循文档存储结构的最流行的 NoSQL 数据库之一。 | |
应用场景 | 较小数据量的性能及运算 | 海量数据的访问效率提升 | MongoDB优于Redis |
主数据库模型 | Redis 遵循键值存储模型。 | MongoDB 遵循文档存储模型。 | |
许可 | Redis 是基于订阅和开源的。 | MongoDB 可以免费使用和开源。 | |
实现语言 | Redis 是用 C 语言编写和实现的。 | MongoDB 是用 C ++语言编写和实现的。 | |
二级索引 | 没有 | 是 | |
API 和其他访问方法 | Redis 遵循专有协议。 | MongoDB 遵循使用 JSON 的专有协议。 | |
服务器端脚本 | LUA | JavaScript 的 | |
分区方法 | Redis 使用 Sharding 进行分区。 | MongoDB 也使用 Sharding 进行分区。 | |
复制方法 | Redis 遵循主从复制。 | MongoDB 也遵循主从复制。 | |
可操作性 | 数据操作方面,redis更好一些,较少的网络IO次数 | 支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富 | MongoDB优于Redis |
MapReduce | 没有 | 是 | |
一致性概念 | 最终的一致性和即时一致性 支持事物,比较弱,仅能保证事物中的操作按顺序执行 | 最终的一致性,不支持事物,靠客户端自身保证 | Redis优于MongoDB |
交易概念 | 乐观锁定,命令块和脚本的原子执行。 | 没有 | |
性能 | 依赖内存,TPS较高 | 依赖内存,TPS较高 | Redis优于MongoDB |
高并发 | 50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s | 善于处理高并发 | |
持久化 | 支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。 | 数据操作会先写入内存,然后再会持久化到硬盘中去,mongodb在启动时,专门初始化一个线程不断循环(除非应用crash掉),用于在一定时间周期内来从defer队列中获取要持久化的数据并写入到磁盘的journal(日志)和mongofile(数据)处,当然因为它不是在用户添加记录时就写到磁盘上 | 可靠性MongoDB优于Redis |
内存与数据量 | redis在2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache) | 适合大数据量存储,依赖系统虚拟内存管理,采用镜像文件存储;内存占有率比较高,官方建议独立部署在64位系统(32位有最大2.5G文件限制,64位没有改限制) | |
内存管理 | Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。 | MongoDB 数据会优先存于内存,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。 | |
可用性 | 依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制;不支持自动sharding,需要依赖程序设定一致hash机制 | 支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制 | MongoDB优于Redis;单点问题上,MongoDB应用简单,相对用户透明,Redis比较复杂,需要客户端主动解决。(MongoDB 一般会使用replica sets和sharding功能结合,replica sets侧重高可用性及高可靠性,而sharding侧重于性能、易扩展) |
用户权限 | 简单的基于密码的访问控制。 | 用户和角色的访问权限。 |
mac安装:
修改配置文件:
mkdir data #用来存放数据
mkdir conf #用来存放配置文件
mkdir log #用来存放日志文件
在conf下创建mongodb.conf 配置文件
#服务实例管理
processManagement:
#后台运行
fork: true
#网络
#4.2版本使用tls 代替ssl, 5.0版本删除net.serviceExecutor
net:
#默认localhost,它强制服务器只监听本地主机IP上的请求,如果需要绑定多个地址,请输入以逗号分隔的值列表。
#示例1: localhost,/tmp/mongod.sock
#示例2 ipv4和ipv6一起使用: localhost, 2001:0DB8:e132:ba26:0d5c:2774:e7f9:d513
bindIp: localhost
#指定端口,默认27017 , 27018分片成员端口, 27019配置服务成员端口
port: 27017
#可以接受的最大并发连接数。window默认1,000,000 ,linux默认RLIMIT_NOFILE* 0.8.
#maxIncomingConnections: <int>
#存储参数storage
#在4.4版本删除了storage.indexBuildRetry
#在6.1版本删除了storage.journal.enabled --journal
storage:
#指定数据存放路径
dbPath: /Users/liych/software/mongodb-7.0.3/data/27017
systemLog:
destination: file
#指定日志存放路径
path: "/Users/liych/software/mongodb-7.0.3/log/27017.log"
#默认false,mongod将备份现有日志并创建一个新文件。 true时就在现有日志文件末尾追加日志
logAppend: true
#日志文件在循环时,指定是重命名还是重新打开一个, rename为重明明,reopen重新打开一个日志文件使用重新打开,以避免日志丢失。
logRotate: rename修改环境变量
vim .bash_profile
#添加
#MongoDB
export MONGO_DB=/Users/liych/software/mongodb-7.0.3
export PATH=$MONGO_DB/bin:$PATH
source .bash_profile
命令
启动
mongod -f conf/mongodb.conf
链接
uri 格式:mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongosh --host ip --port 27017 -u用户 -p密码
或者
mongosh "uri"
> mongo127.0.0.1:12345
--host指定ip
--port指定端口
关闭
>use admin
>db.shutdownServer()
linux安装:
下载安装
第一种使用yum
#不指定版本, 直接用最新版本
sudo yum install -y mongodb-org
#或者指定版本和组件
sudo yum install -y mongodb-org-7.0.3 mongodb-org-database-7.0.3 mongodb-org-server-7.0.3 mongodb-mongosh-7.0.3 mongodb-org-mongos-7.0.3 mongodb-org-tools-7.0.3
#当有新版本可用时,Yum会自动升级包。如果你想阻止MongoDB升级,通过在/etc/yum.conf文件中添加以下exclude指令来锁定包:
第二种自己下载工具包
安装依赖
sudo yum install libcurl openssl xz-libs
下载安装包
解压安装包
tar -zxvf mongodb-linux-*-7.0.3.tgz
配置
第一种把bin下的执行文件复制到/var/local/bin下,就可以直接使用mongo命令
sudo cp /path/to/the/mongodb-directory/bin/* /usr/local/bin/
第二种创建软链接
sudo ln -s /path/to/the/mongodb-directory/bin/* /usr/local/bin/
第三种修改环境变量
可以修改/etc/profile 或者 ~/.base_profile
安装MongoDB Shell (mongosh)进行链接
ulimit注意事项
从MongoDB 4.4开始,如果打开文件数的ulimit值低于64000,则会产生启动错误。
使用默认配置
默认情况下,MongoDB使用mongod用户运行,并使用以下默认目录:
使用默认日志目录和数据目录
sudo mkdir -p /var/lib/mongo #默认数据目录
sudo mkdir -p /var/log/mongodb #默认日志目录
创建mongodb和mongodb组。确保mongod属于组,然后将这些目录的属主和组设置为mongod:
sudo chown -R mongod:mongod /var/lib/mongo
sudo chown -R mongod:mongod /var/log/mongodb
使用自定义配置
需要在/etc/mongod.conf 文件中进行配置
并使用mongod -f /etc/mongod.conf 进行启动
记得使用 sudo chown -R mongod:mongod <directory> 授权给mongod用户
启动
mongod -f /etc/mongo/mongo.conf
mongo.conf配置文件详解
#服务实例管理
processManagement:
#后台运行
fork: true
#指定存放mongos或mongod进程ID (PID)的文件位置。通常实在/etc/init.d中
#pidFilePath: <string>
#加载时区数据库的完整路径。Linux和macOS包自带的配置文件默认将时区数据库路径设置为“/usr/share/zoneinfo”
#timeZoneInfo: <string>
#网络
#4.2版本使用tls 代替ssl, 5.0版本删除net.serviceExecutor
net:
#默认localhost,它强制服务器只监听本地主机IP上的请求,如果需要绑定多个地址,请输入以逗号分隔的值列表。
#示例1: localhost,/tmp/mongod.sock
#示例2 ipv4和ipv6一起使用: localhost, 2001:0DB8:e132:ba26:0d5c:2774:e7f9:d513
bindIp: localhost
#默认false, 如果为true, 绑定到所有地址
#bindIpAll: <boolean>
#指定端口,默认27017 , 27018分片成员端口, 27019配置服务成员端口
port: 27017
#可以接受的最大并发连接数。window默认1,000,000 ,linux默认RLIMIT_NOFILE* 0.8.
#maxIncomingConnections: <int>
#在收到客户端的所有请求时验证,以防止客户端向MongoDB数据库插入畸形或无效的BSON。默认true
#wireObjectCheck: true
#是否启用ipv6, 默认false. 配合net.bindIp 或者 net.bindIpAll
#ipv6: false
#unixDomainSocket:
#默认true, true:是能在Unix套接字上监听。mongodb实例会一直监听UNIX socket,除非net.unixDomainSocket.enabled设置为true,bindIp没有设置,bindIp没有默认指定为127.0.0.1。
#enabled: true
#unix Socket所在的路径。默认/tmp
#pathPrefix:
#设置套接字的SocketFile的访问权限。默认0700
#filePermissions:
#tls:
#在windows或macOS系统上,此参数或tls.certificateKeyFile参数二选一即可,这连个参数是互斥的,只能声明一个。
#certificateSelector: <string>
#在windows和MacOs中,此参数为tls.clusterFile的备选项,他们之间为互斥关系,只能二选一。
#clusterCertificateSelector: <string>
#实现TLS用于mongo的网络连接。1)disabled:mongo不是有TLS;2)allowTLS:mongo不同系统之间连接不使用TLS,对客户端连接同时支持TLS和non-TLS。3)preferTLS:mongo不同系统之间连接使用TLS,对客户端连接同时支持TLS和non-TLS。4)requireTLS:系统只使用TLS的安全连接。
#mode: disabled
#包含CA和密码的.pem文件。当为类linux系统时,当使能TLS时,此参数必填;当为windows或macOS系统时,当使能TLS时,此参数或certificateSelector参数必填。
#certificateKeyFile: <string>
#CA证书的解码密码。
#certificateKeyFilePassword: <string>
#集群或复制集的.pem文件
#clusterFile: <string>
#集群或复制集的CA解码的密码。
#clusterPassword: <string>
#.pem文件,其包含根证书链。
#CAFile: <string>
#.pem文件,包含客户端连接mongo的根证书链。
#clusterCAFile: <string>
#.pem文件,包含了证书撤销列表。
#CRLFile: <string>
#客户端无需证书即可连接mongo服务器
#allowConnectionsWithoutCertificates: <boolean>
#使能集群中其他服务器的TLS证书的验证检查,运行其他服务器使用无效的证书进行连接。
#allowInvalidCertificates:<boolean>
#true:当其他连接实例的证书的hostName非法时,mongo将允许其进行连接。默认false
#allowInvalidHostnames: <boolean>
#阻止mongo基于当前协议的TLS的连接处理。多个协议之间以逗号分隔。
#disabledProtocols: <string>
#是否允许FIPS模式使用TLS库
#FIPSMode: <boolean>
#compression:
#声明默认的压缩器。其将用于mongo服务器间的通信使用。默认 snappy,zstd,zlib
#compressors: <string>
#存储参数storage
#在4.4版本删除了storage.indexBuildRetry
#在6.1版本删除了storage.journal.enabled --journal
storage:
#指定数据存放路径
dbPath: /Users/liych/software/mongodb-7.0.3/data/27017
#journal:
#默认100, 在日志操作之间允许的最大间隔时间(以毫秒为单位)。取值范围是1 ~ 500毫秒。较低的值会增加日志的持久性,但会牺牲磁盘性能。
#commitIntervalMs: <num>
#指定存储每个数据库文件到单独的数据目录。如果在一个已存在的系统使用该选项,需要事先把存在的数据文件移动到目录。默认false
#directoryPerDB: <boolean>
#默认60, mongodb文件刷新频率,尽量不要在生产环境下修改。若设置此参数为0,mongodb不会将内存映射文件同步到磁盘中。mongod能很快处理对journal日志的写,同时会延迟数据文件的写入。此参数对journal日志无效,但若设置为0,则journal会最终占用所有硬盘空间。如设置此参数是为了测试,则应该设置--nojournal为true
#syncPeriodSecs: 60
#mongodb的存储引擎。1)wiredTiger:声明为WiredTiger存储引擎;2)inMemory:声明为 In-Memory 存储引擎。
#engine: wiredTiger
#wiredTiger:
#engineConfig:
#定义WiredTiger 存储引擎用于内部数据缓存的最大值。用于索引的缓存是单独的,不包含在此部分。此缓存大小范围可设置为:0.25GB到10000GB。默认值为(系统内存值 - 1G)/2或256MB。
#cacheSizeGB: <number>
#声明应用压缩WiredTiger 日志文件的压缩算法。1)none:无压缩;2)snappy;3)zlib;4)zstd (Available starting in MongoDB 4.2) 默认值snappy
#journalCompressor: snappy
#是否将索引和collections数据分别存储在dbPath下单独的目录中。即index数据保存“index”子目录,collections数据保存在“collection”子目录。默认值为false,仅对mongod有效。默认值false
#directoryForIndexes: false
#声明WiredTigerLAS.wt文件的最大值
#maxCacheOverflowFileSizeGB: <number> // deprecated in MongoDB 4.4
#collectionConfig:
#集合数据的压缩算法。声明应用压缩WiredTiger 日志文件的压缩算法。1)none:无压缩;2)snappy;3)zlib;4)zstd (Available starting in MongoDB 4.2)
#blockCompressor: snappy
#indexConfig:
#默认true, 是能索引数据的前缀压缩算法。
#prefixCompression: true
#inMemory:
#engineConfig:
#in-memory存储引擎的最大内存。包括数据、索引、操作日志等。可设置范围为:256MB到10TB,默认物理内存的二分之一, 单据GB(RAM-1G)/2
#inMemorySizeGB: <number>
#默认0, 指定保留oplog条目的最小小时数,其中的十进制值表示小时的小数。例如,值1.5表示1小时30分钟。
#oplogMinRetentionHours: 0
systemLog:
#默认值0, 范围为0-5. 组件的默认日志消息冗长级别。冗长级别决定了MongoDB输出的Informational和Debug消息的数量。
#0 是MongoDB默认的日志冗长级别,包括Informational消息。
#1-5增加冗长级别,包括debug日志
#verbosity: <int>
#默认值false, 以安静模式运行mongos或mongod,试图限制输出量。不建议生产环境,如果异常就难以跟踪
#quiet: <boolean>
#默认值false,打印详细信息以便调试。用于支持相关故障排除的附加日志记录。
#traceAllExceptions: <boolean>
#默认user, 将消息记录到syslog时使用的设施级别。您指定的值必须为您的操作系统的syslog实现所支持。要使用此选项,必须设置 systemLog.destination ,syslog。
#syslogFacility: <string>
#所有日志的输出指定是file 或者 syslog
destination: file
#指定日志存放路径
path: "/Users/liych/software/mongodb-7.0.3/log/27017.log"
#默认false,mongod将备份现有日志并创建一个新文件。 true时就在现有日志文件末尾追加日志
logAppend: true
#日志文件在循环时,指定是重命名还是重新打开一个, rename为重明明,reopen重新打开一个日志文件使用重新打开,以避免日志丢失。
logRotate: rename
#默认iso8601-local, 日志消息中时间戳的时间格式, iso8601-utc:1970-01-01T00:00:00.000Z iso8601-local:1969-12-31T19:00:00.000-05:00
#timeStampFormat: <string>
#component:
#accessControl:
#与访问控制相关的组件的日志消息冗长级别。
#verbosity: <int>
#command:
#与命令相关的组件的日志消息冗长级别。
#verbosity: <int>
#授权系统,如果启用了该功能,您将需要第一次通过本地主机接口连接来登录,以创建用户凭据。
security:
#mongo实例直接互相通信的认证密码文件。
#keyFile: <string>
#mongo集群的认证模式。1)keyFile:使用keyFile选项表示的授权文件进行授权处理;2)sendKeyFile:用于滚动升级,发送一个认证keyFile,但同时可以keyFile和x.509认证;3)sendX509:用于滚动升级,发送一个x.509用于认证,但同时可以keyFile和x.509认证;4)x509:推荐使用,发送x.509文件用于认证,同时只接受x.509认证。
#clusterAuthMode: keyFile
#disabled或者enabled,仅对mongod有效;表示是否开启用户访问控制(Access Control),即客户端可以通过用户名和密码认证的方式访问系统的数据,默认为“disabled”,即客户端不需要密码即可访问数据库数据。(限定客户端与mongod、mongos的认证)
authorization: disabled
#运行mongo服务器在部署时直接通过认证或非认证方式进行互相连接。如若使用keyFile进行内部认证,则mongo会创建认证的连接到其他部署的mongo实例,若认证失败,则会使用非认证的连接替代。此选择为true无法保证强制的用户权限控制,用户可创建无无任何权限控制的连接到部署环境中,并进行读写及权限处理等操作。
#transitionToAuth: false
#是否允许执行服务器端的JavaScript脚本,若不允许,则无法允许如$where、mapReduce等方法。默认true
#javascriptEnabled: <boolean>
#此参数会阻止mongo在日志时打印出数据库中的敏感数据
#redactClientLogData: <boolean>
#保存mongo复制集或集群的白名单的ip列表,若连接的服务不在白名单则不允许连接。若mongod以非认证方式启动,则此参数无效
#clusterIpSourceAllowlist:
# - <string>
#sasl:
# hostName: <string>
# serviceName: <string>
# saslauthdSocketPath: <string>
#允许事物存储引擎的加密
#enableEncryption: <boolean>
#用于加密的密码模式。1)AES256-CBC:256位高级加密标准的密码块链接模式;2)AES256-GCM:256位高级加密标准,在Galois/计数器模式只能在Linux上使用。
#encryptionCipherMode: AES256-CBC
#当通过KMIP管理秘钥时的本地keyFile的路径。只有在nableEncryption设为true时有效
#encryptionKeyFile: <string>
#设置自定义属性和值
#setParameter:
# <parameter1>: <value1>
# <parameter2>: <value2>
#性能分析
#operationProfiling:
#级别, 默认off, off: 分析器关闭并且不收集任何数据。slowOp: 该分析器收集耗时超过slowms值的操作的数据。all: 分析器收集所有操作的数据。
#mode: off
#数据库profiler判定一个操作是“慢查询”的时间阀值,单位毫秒
#slowOpThresholdMs: 100
#性能检测器或日志的影响因子
#slowOpSampleRate: 1.0
#4.2.2引入的过滤器
#filter: '{ op: "query", millis: { $gt: 2000 } }' #过滤器将分析器配置为记录耗时超过2秒的查询操作:
#复制集
#replication:
#replication操作日志的最大尺寸,单位:MB。mongod进程根据磁盘最大可用空间来创建oplog,比如64位系统,oplog为磁盘可用空间的5%,一旦mongod创建了oplog文件,此后再次修改oplogSizeMB将不会生效。此值不要设置的太小, 应该足以保存24小时的操作日志,以保证secondary有充足的维护时间;如果太小,secondary将不能通过oplog来同步数据,只能全量同步。
#oplogSizeMB: 512
#“复制集”的名称,复制集中的所有mongd实例都必须有相同的名字,sharding分布式下,不同的sharding应该使用不同的replSetName,有些驱动会根据复制集的名字进行分组
#replSetName: server0
#默认true, 是否开启readConcern的级别为“majority”,默认为false;只有开启此选项,才能在read操作中使用“majority”。(3.2+版本)
#enableMajorityReadConcern: <boolean>
#分片服务配置
#sharding:
#服务器角色类型. configsvr:将此实例作为配置服务器启动。默认情况下,实例在端口27019上启动。还必须指定一个 replSetName。 shardsvr:将此实例作为一个分片启动。默认情况下,实例在端口27018上启动。还必须指定一个 replSetName。
#此配置只适合mongod
#clusterRole: <string>
#默认false, 在块迁移过程中,shard不保存从该shard迁移过来的文档。仅用于企业版和云数据库
#archiveMovedChunks: <boolean>
#mongos 路由服务独有配置
#replication:
#默认15, ping时间(以毫秒为单位). 当Mongos收到一个允许二级成员读取的请求时,Mongos将:查找ping时间最低的集合成员。构造一个副本集成员列表,该列表位于距该集最近的合适成员15毫秒的ping时间内。
#localPingThresholdMs: 15
#sharding:
#分片群集的配置服务器。可以使用逗号分隔一到三个服务器。如果处于不同的位置,需要指定最近的一个。不能移除配置服务器
#configDB: 192.168.200.A:20000,192.168.200.A:21000,192.168.200.A:22000 #必须是1个或则3个配置 。
#审计日志信息
#auditLog:
#5.3引入, 指定审计的压缩方式 zstd:使用zstd算法进行压缩 none: 不压缩(默认)
#compressionMode: none
#指定向何处发送审计事件, syslog:将审计事件以JSON格式输出到syslog。 console: 以JSON格式将审计事件输出到stdout。 file: 以auditLog.format格式输出到auditLog.path
#destination: <string>
#输出格式 BSON:二进制格式 JSON:json数据格式性能低一些
#format: <string>
#输出地址
#path: <string>基础语法:
MongoDB 中可以使用的类型如下表所示:
类型 | 类型序号/数字 | 备注 |
Double | 1 | 双精度浮点值。用于存储浮点值。 |
String | 2 | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Object | 3 | 用于内嵌文档。 |
Array | 4 | 用于将数组或列表或多个值存储为一个键。 |
Binary data | 5 | 二进制数据。用于存储二进制数据。 |
Undefined | 6 | 已废弃。 |
Object id | 7 | 对象 ID。用于创建文档的 ID。 |
Boolean | 8 | 布尔值。用于存储布尔值(真/假)。 |
Date | 9 | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Null | 10 | 用于创建空值。 |
Regular Expression | 11 | 正则表达式类型。用于存储正则表达式。 |
JavaScript | 13 |
|
Symbol | 14 | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
JavaScript (with scope) | 15 |
|
32-bit integer | 16 |
|
Timestamp | 17 | 时间戳。记录文档修改或添加的具体时间。 |
64-bit integer | 18 |
|
Min key | 255 | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Max key | 127 | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
如果想获取 "col" 集合中 title 为 String 的数据,你可以使用以下命令,String 类型序号为2:
db.col.find({"title" : {$type : 2}})
或
db.col.find({"title" : {$type : 'string'}})
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB如果你想查看所有数据库,可以使用 show dbs 命令
db.dropDatabase()
{ "dropped" : "runoob", "ok" : 1 }删除当前数据库,默认为 test,你可以使用show dbs 命令查看当前数据库名
db.createCollection(name, options)
创建集合
参数说明:
name: 要创建的集合名称
options: 可选参数, 指定有关内存大小及索引的选项
如果要查看已有集合,可以使用 show collections 或 show tables 命令:
创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
> db.createCollection("mycol", { capped : true, autoIndexId : true, size :
6142800, max : 10000 } )
{ "ok" : 1 }
>在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
db.collection.drop()
删除集合语法, collection 是一个集合名
1.带条件删除
>db.user.remove({"name":"zhangshan"});
2.删除所有数据
>db.user.remove({})
3.删除集合
>db.user.drop()
4.删除整个数据库
>show dbs;
>db.user.getDB()
>db.dropDatabase()
db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.save(document)
save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
3.2 版本之后新增了 db.collection.insertOne() 和 db.collection.insertMany()。
db.collection.insertOne() 用于向集合插入一个新文档,语法格式如下:
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)db.collection.insertMany() 用于向集合插入一个多个文档,语法格式如下:
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)参数说明:
document:要写入的文档。
writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
ordered:指定是否按顺序写入,默认 true,按顺序写入。
>db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})以上实例中 col 是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
db.collection.find(query, projection)
查询方法
query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
>db.col.find().pretty()
pretty() 方法以格式化的方式来显示所有文档。
MongoDB 与 RDBMS Where 语句比较
如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:
操作 | 格式 | 范例 | RDBMS中的类似语句 |
等于 | {<key>:<value>} | db.col.find({"by":"菜鸟教程"}).pretty() | where by = '菜鸟教程' |
小于 | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
MongoDB (>) 大于操作符 - $gt
如果你想获取 "col" 集合中 "likes" 大于 100 的数据,你可以使用以下命令:
db.col.find({likes : {$gt : 100}})
类似于SQL语句:
Select * from col where likes > 100;
db.col.find({likes : {$lt :200, $gt : 100}})
类似于SQL语句:
Select * from col where likes>100 AND likes<200;
查询 title 包含"教"字的文档:
db.col.find({title:/教/})
查询 title 字段以"教"字开头的文档:
db.col.find({title:/^教/})
查询 titl e字段以"教"字结尾的文档:
db.col.find({title:/教$/})
MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法格式如下:
>db.col.find({key1:value1, key2:value2}).pretty()
以下实例通过 by 和 title 键来查询 菜鸟教程 中 MongoDB 教程 的数据
> db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"}).pretty()
>{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}MongoDB OR 条件
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()AND 和 OR 联合使用
以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: 'where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')'
>db.col.find({"likes":{$gt:50},$or:[{"by":"菜鸟教程"},{"title":"MongoDB 教程"}]}).pretty()
{
"_id":ObjectId("56063f17ade2f21f36b03133"),
"title":"MongoDB 教程",
"description":"MongoDB 是一个 Nosql 数据库",
"by":"菜鸟教程",
"url":"http://www.runoob.com",
"tags":[
"mongodb",
"database",
"NoSQL"
],
"likes":100
}MongoDB Limit() 方法
读取指定数量的数据记录
limit()方法基本语法如下所示:
>db.COLLECTION_NAME.find().limit(NUMBER)
MongoDB Skip() 方法
跳过指定数量的数据
以下实例只会显示第二条文档数据
>db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
{ "title" : "Java 教程" }
>注:skip()方法默认参数为 0 。
嵌入式关系,多级查询
使用嵌入式方法,我们可以把用户地址嵌入到用户的文档中:
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address": [
{
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Los Angeles",
"state": "California"
},
{
"building": "170 A, Acropolis Apt",
"pincode": 456789,
"city": "Chicago",
"state": "Illinois"
}]
} 以上数据保存在单一的文档中,可以比较容易的获取和维护数据。 你可以这样查询用户的地址:
>db.users.findOne({"name":"Tom Benzamin"},{"address":1})
注意:以上查询中 db 和 users 表示数据库和集合。