官网: Download MongoDB Community Server

MongoDB:应用程序数据平台

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

下载安装包

Download MongoDB Community Server

解压安装包

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 

 双精度浮点值。用于存储浮点值。

String 

 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。

Object 

 用于内嵌文档。

Array 

 用于将数组或列表或多个值存储为一个键。

Binary data 

 二进制数据。用于存储二进制数据。

Undefined 

已废弃。 

Object id 

 对象 ID。用于创建文档的 ID。

Boolean 

 布尔值。用于存储布尔值(真/假)。

Date 

 日期时间。用 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 表示数据库和集合。

文章作者: 刘同学
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 刘同学的小站
中间件 MongoDB
喜欢就支持一下吧