MongoDB 入门极简教程


声明:本文转载自https://my.oschina.net/kangvcar/blog/1558252,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

概述

MongoDB 是一款跨平台、面向文档的数据库。用它创建的数据库可以实现高性能、高可用性,并且能够轻松扩展。MongoDB 的运行方式主要基于两个概念:集合(collection)与文档(document)。

数据库

数据库是集合的实际容器。每一数据库都在文件系统中有自己的一组文件。一个 MongoDB 服务器通常有多个数据库。

集合

集合就是一组 MongoDB 文档。它相当于关系型数据库(RDBMS)中的表这种概念。集合位于单独的一个数据库中。集合不能执行模式(schema)。一个集合内的多个文档可以有多个不同的字段。一般来说,集合中的文档都有着相同或相关的目的。

文档

文档就是一组键-值对。文档有着动态的模式,这意味着同一集合内的文档不需要具有同样的字段或结构。 下表展示了关系型数据库与 MongoDB 在术语上的对比:

关系型数据库MongoDB
数据库数据库
集合
文档
字段
Join 内嵌文档
主键主键(由 MongoDB 提供的默认 key_id)
数据库服务器客户端
MySQL/OracleMongoDB
mysql/sqlplusmongo

范例文档

下面这个范例展示了一个简单的博客站点的文档结构,它是由逗号分隔的键值对构成的。

{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100, comments: [ { user:'user1', message: 'My first comment', dateCreated: new Date(2011,1,20,2,15), like: 0 }, { user:'user2', message: 'My second comments', dateCreated: new Date(2011,1,25,7,45), like: 5 } ] } 

_id 是一个 12 字节长的十六进制数,它保证了每一个文档的唯一性。在插入文档时,需要提供 _id 。如果你不提供,那么 MongoDB 就会为每一文档提供一个唯一的 id。 _id 的头 4 个字节代表的是当前的时间戳,接着的后 3 个字节表示的是机器 id 号,接着的 2 个字节表示 MongoDB 服务器进程 id,最后的 3 个字节代表递增值。

优势

任何关系型数据库都采用一种典型的设计模式,展示表的数目以及表之间的关系。然而 MongoDB 却没有关系这个概念。

MongoDB 相比 RDBMS 的优势

  • 模式较少:MongoDB 是一种文档数据库,一个集合可以包含各种不同的文档。每个文档的字段数、内容以及文档大小都可以各不相同。
  • 采用单个对象的模式,清晰简洁。
  • 没有复杂的连接功能。
  • 深度查询功能。MongoDB 支持对文档执行动态查询,使用的是一种不逊色于 SQL 语言的基于文档的查询语言。
  • 具有调优功能。
  • 易于扩展。MongoDB 非常易于扩展。
  • 不需要从应用对象到数据库对象的转换/映射。
  • 使用内部存储存储(窗口化)工作集,能够更快地访问数据。

为何选择使用 MongoDB

  • 面向文档的存储:以 JSON 格式的文档保存数据。
  • 任何属性都可以建立索引。
  • 复制以及高可扩展性。
  • 自动分片。
  • 丰富的查询功能。
  • 快速的即时更新。
  • 来自 MongoDB 的专业支持。

MongoDB 适用的领域

  • 大数据
  • 内容管理及交付
  • 移动及社会化基础设施
  • 用户数据管理
  • 数据中心

安装环境

在 Windows 上安装 MongoDB

在 Windows 上安装 MongoDB,先要从 http://www.mongodb.org/downloads 上下载 MongoDB 的最新版 本。根据你的 Windows 版本选择正确的 MongoDB 版本。要想知道你的 Windows 版本,在命令行中输入下列指令:

C:\>wmic os get osarchitecture OSArchitecture 64-bit C:\> 

32 位版本的 MongoDB 只支持 2G 以下的数据库,只适用于测试及评估。 现在将下载的文件解压至 c:\ 或其他位置。解压后的文件夹名称应该是 mongodb-win32-i386-[version] 或mongodb-win32-x86_64-[version] 。这里的 [version] 代表下载的 MongoDB 版本号。 打开命令行,运行下列命令:

C:\>move mongodb-win64-* mongodb 1 dir(s) moved. C:\> 

假如将文件解压缩至其他位置,可以采用 cd FOOLDER/DIR找到指定路径,然后运行上面的代码。 MongoDB 需要一个 data 文件夹来保存文件。默认的 MongoDB data 目录位于 c:\data\db 。所以需要用命令行来创建这个文件夹。执行下列命令即可:

C:\>md data C:\md data\db 

如果已经把 MongoDB 安装在其他位置,则需要在 mongod.exe 设置 dbpath 路径来指定 \data\db 的替换路径。如下面代码所示。 在命令行中,导航至 bin 目录,进入 MongoDB 安装文件夹。假设我的安装文件夹是: D:\set up\mongodb。

C:\Users\XYZ>d: D:\>cd "set up" D:\set up>cd mongodb D:\set up\mongodb>cd bin D:\set up\mongodb\bin>mongod.exe --dbpath "d:\set up\mongodb\data" 

控制台输出会显示 s waiting for connections 消息,这表示 mongod.exe 进程已经成功运行。 要想运行 mongodb,需要输入下列命令:

D:\set up\mongodb\bin>mongo.exe MongoDB shell version: 2.4.6 connecting to: test >db.test.save( { a: 1 } ) >db.test.find() { "_id" : ObjectId(5879b0f65a56a454), "a" : 1 } > 

运行显示 mongodb 已安装并成功运行。下次运行 mongodb 时,只需输入以下命令即可:

D:\set up\mongodb\bin>mongod.exe --dbpath "d:\set up\mongodb\data" D:\set up\mongodb\bin>mongo.exe 

在 Ubuntu 上安装 MongoDB

运行下列命令,导入 MongoDB 公开 GPG 键:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 

使用下列命令,创建一个 /etc/apt/sources.list.d/mongodb.list 文件。

echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list 

运行下列命令,更新存储库: sudo apt-get update 然后利用下列命令安装 MongoDB: apt-get install mongodb-10gen=2.2.3 在上面的命令中,安装的 2.2.3 版本正是 MongoDB 的当前版本。记住一定要及时更新至最新的版本。至此,MongoDB 的安装就成功了。 启动 MongoDB: sudo service mongodb start 停止 MongoDB: sudo service mongodb stop 重启 MongoDB: sudo service mongodb restart 使用 mongodb 时,输入下列命令即可: mongo 这将连接到运行中的 mongod 实例中。

MongoDB 帮助

要想获取命令列表,在 mongodb 客户端中输入 db.help(),将显示如下图所示的命令列表:

> db.help() DB methods: 	db.adminCommand(nameOrDocument) - switches to 'admin' db, and runs command [ just calls db.runCommand(...) ] 	db.auth(username, password) 	db.cloneDatabase(fromhost) 	db.commandHelp(name) returns the help for the command 	db.copyDatabase(fromdb, todb, fromhost) 	db.createCollection(name, { size : ..., capped : ..., max : ... } ) 	db.createView(name, viewOn, [ { $operator: {...}}, ... ], { viewOptions } ) 	db.createUser(userDocument) 	db.currentOp() displays currently executing operations in the db 	db.dropDatabase() 	db.eval() - deprecated 	db.fsyncLock() flush data to disk and lock server for backups 	db.fsyncUnlock() unlocks server following a db.fsyncLock() 	db.getCollection(cname) same as db['cname'] or db.cname 	db.getCollectionInfos([filter]) - returns a list that contains the names and options of the db's collections 	db.getCollectionNames() 	db.getLastError() - just returns the err msg string 	db.getLastErrorObj() - return full status object 	db.getLogComponents() 	db.getMongo() get the server connection object 	db.getMongo().setSlaveOk() allow queries on a replication slave server 	db.getName() 	db.getPrevError() 	db.getProfilingLevel() - deprecated 	db.getProfilingStatus() - returns if profiling is on and slow threshold 	db.getReplicationInfo() 	db.getSiblingDB(name) get the db at the same server as this one 	db.getWriteConcern() - returns the write concern used for any operations on this db, inherited from server object if set 	db.hostInfo() get details about the server's host 	db.isMaster() check replica primary status 	db.killOp(opid) kills the current operation in the db 	db.listCommands() lists all the db commands 	db.loadServerScripts() loads all the scripts in db.system.js 	db.logout() 	db.printCollectionStats() 	db.printReplicationInfo() 	db.printShardingStatus() 	db.printSlaveReplicationInfo() 	db.dropUser(username) 	db.repairDatabase() 	db.resetError() 	db.runCommand(cmdObj) run a database command.  if cmdObj is a string, turns it into { cmdObj : 1 } 	db.serverStatus() 	db.setLogLevel(level,<component>) 	db.setProfilingLevel(level,<slowms>) 0=off 1=slow 2=all 	db.setWriteConcern( <write concern doc> ) - sets the write concern for writes to the db 	db.unsetWriteConcern( <write concern doc> ) - unsets the write concern for writes to the db 	db.setVerboseShell(flag) display extra information in shell output 	db.shutdownServer() 	db.stats() 	db.version() current version of the server 

MongoDB 统计信息

要想获取 MongoDB 服务器的统计信息,在 mongodb 客户端中输入 db.stat(),随即将显示数据库名称、集合数目,以及数据库中的文档等信息。如图所示:

> db.stats() { 	"db" : "test", 	"collections" : 1, 	"views" : 0, 	"objects" : 1, 	"avgObjSize" : 31, 	"dataSize" : 31, 	"storageSize" : 16384, 	"numExtents" : 0, 	"indexes" : 1, 	"indexSize" : 16384, 	"ok" : 1 } 

数据模型

MongoDB 中的数据模式非常灵活。同一集合中的文档不需要具有同一字段或结构,集合文档的公用字段可能包含不同类型的数据。

设计 MongDB 模式时应注意的问题

  • 根据用户需求来设计模式。
  • 如果想一起使用对象,请将这些对象合并到一个文档中,否则要将它们分开(但是要确保不需要连接)。
  • 经常复制数据(但要有一定限度),因为与计算时间相比,硬盘空间显得非常便宜。
  • 在写入时进行连接,而不能在读取时连接。
  • 针对经常发生的用例来设计模式。
  • 在模式中实现复杂的聚合。

范例

假使一个客户需要为他的博客站点设计一个数据库,让我们来看看 RDBMS 与 MongoDB 在模式设计上的差异。网站需求如下所示:

  • 每篇博客都具有唯一的标题、描述以及 URL。
  • 每篇博客都具有一个或多个标签。
  • 每篇博客都具有发表者的名称,以及喜欢
  • 每篇博客都有用户的评论,用户名、消息、日期时间以及评论的喜欢度。
  • 每篇博客都可以有 0 个或多个评论。 在 RDBMS 中,设计一个能够满足上述需求的数据库模式至少需要 3 个表。 在 MongoDB 中,设计出来的模式却只有一个集合 post,其结构如下:
{ _id: POST_ID title: TITLE_OF_POST, description: POST_DESCRIPTION, by: POST_BY, url: URL_OF_POST, tags: [TAG1, TAG2, TAG3], likes: TOTAL_LIKES, comments: [ { user:'COMMENT_BY', message: TEXT, dateCreated: DATE_TIME, like: LIKES }, { user:'COMMENT_BY', message: TEXT, dateCreated: DATE_TIME, like: LIKES } ] } 

虽然只是展示数据,在 RDBMS 中需要连接三张表,而在 MongoDB 中则只需要一个集合。

创建数据库

use 命令

MongoDB 用 use + 数据库名称 的方式来创建数据库。 use 会创建一个新的数据库,如果该数据库存在,则返回这个数据库。

语法格式

use 语句的基本格式如下: use DATABASE_NAME

范例

创建一个名为mydb的数据库,使用 use 语句如下:

>use mydb switched to db mydb 使用命令 db 检查当前选定的数据库。 >db mydb 

使用命令 show dbs 来检查数据库列表。

>show dbs local 0.78125GB test 0.23012GB 

刚创建的数据库(mydb)没有出现在列表中。为了让数据库显示出来,至少应该插入一个文档。

>db.movie.insert({"name":"tutorials point"}) >show dbs local 0.78125GB mydb 0.23012GB test 0.23012GB 

在 MongoDB 中,默认的数据库是 test,如果你没有创建任何数据库,那么集合就会保存在 test 数据库中。

删除数据库

dropDatabase() 方法

MongoDB 的 dropDatabase()命令用于删除已有数据库。

语法格式

dropDatabase() 命令的语法格式如下: db.dropDatabase() 它将删除选定的数据库。如果没有选定要删除的数据库,则它会将默认的 test 数据库删除。

范例

首先使用 show dbs 来列出已有的数据库。

>show dbs local 0.78125GB mydb 0.23012GB test 0.23012GB 

如果想删除新数据库 ,如下面这样使用 dropDatabase()方法:

>use mydb switched to db mydb >db.dropDatabase() >{ "dropped" : "mydb", "ok" : 1 } 

再来看一下数据库列表,确实删除了

>show dbs local 0.78125GB test 0.23012GB 

创建集合

createCollection() 方法

在 MongoDB 中,创建集合采用 db.createCollection(name, options)方法。

语法格式

createCollection() 方法的基本格式如下: db.createCollection(name, options) 在该命令中, name 是所要创建的集合名称。 options 是一个用来指定集合配置的文档。

参数类型描述
name字符串所要创建的集合名称
options文档可选。指定有关内存大小及索引的选项

参数 options 是可选的,所以你必须指定的只有集合名称。下表列出了所有可用选项: |字段|类型 |描述| |----|----|----| |capped |布尔|(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。| |autoIndexID|布尔|(可选)如为 true,自动在 _id 字段创建索引。默认为 false。| |size |数值|(可选)为固定集合指定一个最大值(以字节计)。如果 capped 为 true,也需要指定该字段。| |max |数值|(可选)指定固定集合中包含文档的最大数量。在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。|

范例

不带参数的 createCollection() 方法的基本格式为:

>use test switched to db test 第 1 章 教程 | 17 >db.createCollection("mycollection") { "ok" : 1 } 

可以使用 show collections 来查看创建了的集合。

>show collections mycollection system.indexes 

下面是带有几个关键参数的 createCollection()的用法:

>db.createCollection("mycol", { capped : true, autoIndexID : true, size : 6142800, max : 10000 } ) { "ok" : 1 } 

在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。

>db.tutorialspoint.insert({"name" : "tutorialspoint"}) >show collections mycol mycollection system.indexes tutorialspoint 

删除集合

drop() 方法

MongoDB 利用 db.collection.drop()来删除数据库中的集合。 ###语法格式 drop() 命令的基本格式如下: db.COLLECTION_NAME.drop()

范例

首先检查在数据库 mydb 中已有集合:

>use mydb switched to db mydb >show collections mycol mycollection system.indexes tutorialspoint 

接着删除集合 mycollection。

>db.mycollection.drop() true 

再次检查数据库中的现有集合:

>show collections mycol system.indexes tutorialspoint 

如果成功删除选定集合,则 drop()方法返回 true,否则返回false。

数据类型

MongoDB 支持如下数据类型:

  • String:字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
  • Integer:整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
  • Boolean:布尔值。用于存储布尔值(真/假)。
  • Double:双精度浮点值。用于存储浮点值。
  • Min/Max keys:将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
  • Arrays:用于将数组或列表或多个值存储为一个键。
  • Timestamp:时间戳。记录文档修改或添加的具体时间。
  • Object:用于内嵌文档。
  • Null:用于创建空值。
  • Symbol:符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
  • Date:日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对 象,传入年月日信息。
  • Object ID:对象 ID。用于创建文档的 ID。
  • Binary Data:二进制数据。用于存储二进制数据。
  • Code:代码类型。用于在文档中存储 JavaScript 代码。
  • Regular expression:正则表达式类型。用于存储正则表达式。

插入文档

insert() 方法

要想将数据插入 MongoDB 集合中,需要使用insert()save()方法。

语法格式

insert()方法的基本格式为: db.COLLECTION_NAME.insert(document)

范例 1

>db.mycol.insert({ _id: ObjectId(7df78ad8902c), title: 'MongoDB Overview', description: 'MongoDB is no sql database', by: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 }) 

mycol 是上一节所创建的集合的名称。如果数据库中不存在该集合,那么 MongoDB 会创建该集合,并向其中插入文档。 在插入的文档中,如果我们没有指定 _id 参数,那么 MongoDB 会自动为文档指定一个唯一的 ID。 _id 是一个 12 字节长的 16 进制数,这 12 个字节的分配如下: _id: ObjectId(4 bytes timestamp, 3 bytes machine id, 2 bytes process id, 3 bytes incrementer) 为了,你可以将用 insert() 方法传入一个文档数组,范例如下:

范例 2

>db.post.insert([ { title: 'MongoDB Overview', description: 'MongoDB is no sql database', by: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 }, { title: 'NoSQL Database', description: 'NoSQL database doesn't have tables', by: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 20, comments: [ { user:'user1', message: 'My first comment', dateCreated: new Date(2013,11,10,2,35), like: 0 } ] } ]) 

也可以用 db.post.save(document)插入文档。如果没有指定文档的 _id ,那么save() 就和 insert()完全一样了。如果指定了文档的 _id ,那么它会覆盖掉含有 save() 方法中指定的 _id 的文档的全部数据。

查询文档

find() 方法

要想查询 MongoDB 集合中的数据,使用 find() 方法。 ###语法格式 find() 方法的基本格式为: db.COLLECTION_NAME.find() find()方法会以非结构化的方式来显示所有文档。 pretty() 方法用格式化方式显示结果,使用的是 pretty() 方法。 语法格式 >db.mycol.find().pretty()

范例

>db.mycol.find().pretty() { "_id": ObjectId(7df78ad8902c), "title": "MongoDB Overview", "description": "MongoDB is no sql database", "by": "tutorials point", "url": "http://www.tutorialspoint.com", "tags": ["mongodb", "database", "NoSQL"], "likes": "100" } 

除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。

MongoDB 中类似于 WHERE 子句的语句

如果想要基于一些条件来查询文档,可以使用下列操作。 |操作 |格式 |范例 |RDBMS中的类似语句| |----|----|----|----| |等于|{: } |db.mycol.find({"by":"tutorials point"}).pretty()|where by = 'tutorials point'| |小于|{:{$lt:}}|db.mycol.find({"likes":{$lt:50}}).pretty()|where likes < 50| |小于或等于|{:{$lte:}}|db.mycol.find({"likes":{$lte:50}}).pretty()|where likes <= 50| |大于|{:{$gt:}}|db.mycol.find({"likes":{$gt:50}}).pretty()|where likes > 50| |大于或等于|{:{$gte:}}|db.mycol.find({"likes":{$gte:50}}).pretty()|where likes >= 50| |不等于|{:{$ne:}}|db.mycol.find({"likes":{$ne:50}}).pretty()|where likes != 50|

MongoDB 中的 And 条件

语法格式

find() 方法中,如果传入多个键,并用逗号( , )分隔它们,那么 MongoDB 会把它看成是 AND 条件。AND条件的基本语法格式为: db.mycol.find({key1:value1, key2:value2}).pretty()

范例

下例将展示所有由 “tutorials point” 发表的标题为 “MongoDB Overview” 的教程。

>db.mycol.find({"by":"tutorials point","title": "MongoDB Overview"}).pretty() { "_id": ObjectId(7df78ad8902c), "title": "MongoDB Overview", "description": "MongoDB is no sql database", "by": "tutorials point", "url": "http://www.tutorialspoint.com", "tags": ["mongodb", "database", "NoSQL"], "likes": "100" } 

对于上例这种情况,RDBMS 采用的 WHERE 子句将会是: where by='tutorials point' AND title='MongoDB Overview'。你可以在 find 子句中传入任意的键值对。

MongoDB 中的 OR 条件

语法格式

若基于 OR 条件来查询文档,可以使用关键字$or。 OR 条件的基本语法格式为:

>db.mycol.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty() 

###范例 下例将展示所有由 “tutorials point” 发表的标题为 “MongoDB Overview” 的教程。

>db.mycol.find({$or:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty() { "_id": ObjectId(7df78ad8902c), "title": "MongoDB Overview", "description": "MongoDB is no sql database", "by": "tutorials point", "url": "http://www.tutorialspoint.com", "tags": ["mongodb", "database", "NoSQL"], "likes": "100" } 

结合使用 AND 与 OR 条件

范例

下例所展示文档的条件为:喜欢数大于 100,标题是 “MongoDB Overview”,或者是由 “tutorials point”所发表的。响应的 SQL WHERE 子句为: where likes>10 AND (by = 'tutorials point' OR title = 'MongoDB Overview')

>db.mycol.find({"likes": {$gt:10}, $or: [{"by": "tutorials point"},{"title": "MongoDB Overview"}]}).pretty() { "_id": ObjectId(7df78ad8902c), "title": "MongoDB Overview", "description": "MongoDB is no sql database", "by": "tutorials point", "url": "http://www.tutorialspoint.com", "tags": ["mongodb", "database", "NoSQL"], "likes": "100" } 

更新文档

MongoDB 中的 update() 与 save() 方法都能用于更新集合中的文档。 update() 方法更新已有文档中的值,而 save() 方法则是用传入该方法的文档来替换已有文档。

update()方法

update() 方法更新已有文档中的值。

语法格式

update()方法基本格式如下: db.COLLECTION_NAME.update(SELECTIOIN_CRITERIA, UPDATED_DATA)

范例

假如 mycol 集合中有下列数据:

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"} { "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"} { "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"} 

下面的例子将把文档原标题 'MongoDB Overview' 替换为新的标题 'New MongoDB Tutorial'。

>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}}) >db.mycol.find() { "_id" : ObjectId(5983548781331adf45ec5), "title":"New MongoDB Tutorial"} { "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"} { "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"} 

MongoDB 默认只更新单个文档,要想更新多个文档,需要把参数 multi 设为 true 。

>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}},{multi:true}) 

save() 方法

save()方法利用传入该方法的文档来替换已有文档。 语法格式 save() 方法基本语法格式如下: db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA}) ###范例 下例用 _id 为 '5983548781331adf45ec7' 的文档代替原有文档。

>db.mycol.save( { "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point New Topic", "by":"Tutorials Point" } ) >db.mycol.find() { "_id" : ObjectId(5983548781331adf45ec5), "title":"Tutorials Point New Topic", "by":"Tutorials Point"} { "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"} { "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"} 

删除文档

remove() 方法

MongoDB 利用 remove() 方法 清除集合中的文档。它有 2 个可选参数:

  • deletion criteria:(可选)删除文档的标准。
  • justOne:(可选)如果设为 true 或 1,则只删除一个文档。

语法格式

remove()方法的基本语法格式如下所示: db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)

范例

假如 mycol 集合中包含下列数据:

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"} { "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"} { "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"} 

下面我们将删除其中所有标题为 'MongoDB Overview' 的文档。

>db.mycol.remove({'title':'MongoDB Overview'}) >db.mycol.find() { "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"} { "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"} 

只删除一个文档

如果有多个记录,而你只想删除第一条记录,那么就设置 remove() 方法中的 justOne 参数: db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

删除所有文档

如果没有指定删除标准,则 MongoDB 会将集合中所有文档都予以删除。 这等同于 SQL 中的 truncate 命令。

>db.mycol.remove() >db.mycol.find() 

映射

在 MongoDB 中,映射(Projection)指的是只选择文档中的必要数据,而非全部数据。如果文档有 5 个字段,而你只需要显示 3 个,则只需选择 3 个字段即可。

find()方法

MongoDB 的查询文档曾介绍过find() 方法,它可以利用 AND 或 OR 条件来获取想要的字段列表。在 MongoDB 中执行 find() 方法时,显示的是一个文档的所有字段。要想限制,可以利用 0 或 1 来设置字段列表。1 用于显示字段,0 用于隐藏字段。

语法格式

带有映射的 find() 方法的基本语法格式为: db.COLLECTION_NAME.find({},{KEY:1})

范例

假如 mycol 集合拥有下列数据:

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"} { "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"} { "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"} 

下例将在查询文档时显示文档标题。

>db.mycol.find({},{"title":1,_id:0}) {"title":"MongoDB Overview"} {"title":"NoSQL Overview"} {"title":"Tutorials Point Overview"} 

注意:在执行 find() 方法时, _id 字段是一直显示的。如果不想显示该字段,则可以将其设为 0。

限制记录

limit() 方法

要想限制 MongoDB 中的记录,可以使用 limit()方法。limit() 方法接受一个数值类型的参数,其值为想要显示的文档数。

语法格式

limit()方法的基本语法格式为: db.COLLECTION_NAME.find().limit(NUMBER)

范例

假设 mycol 集合拥有下列数据:

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"} { "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"} { "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"} 

下例将在查询文档时只显示 2 个文档。

>db.mycol.find({},{"title":1,_id:0}).limit(2) {"title":"MongoDB Overview"} {"title":"NoSQL Overview"} 

如果未指定limit() 方法中的数值参数,则将显示该集合内的所有文档。

skip() 方法

语法格式

skip()方法基本语法格式为: db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

范例

下例将只显示第二个文档:

>db.mycol.find({},{"title":1,_id:0}).limit(1).skip(1) {"title":"NoSQL Overview"} 

注意: skip() 方法中的默认值为 0。

记录排序

sort() 方法

MongoDB 中的文档排序是通过 sort()方法来实现的。 sort() 方法可以通过一些参数来指定要进行排序的字段,并使用 1 和 -1 来指定排序方式,其中 1 表示升序,而 -1 表示降序。

语法格式

sort() 方法基本格式为: db.COLLECTION_NAME.find().sort({KEY:1})

范例

假设集合 myycol 包含下列数据:

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"} { "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"} { "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"} 

下面的范例将显示按照降序排列标题的文档。

>db.mycol.find({},{"title":1,_id:0}).sort({"title":-1}) {"title":"Tutorials Point Overview"} {"title":"NoSQL Overview"} {"title":"MongoDB Overview"} 

注意,如果不指定排序规则, sort() 方法将按照升序排列显示文档。

索引

索引能够实现高效地查询。没有索引,MongoDB 就必须扫描集合中的所有文档,才能找到匹配查询语句的文档。这种扫描毫无效率可言,需要处理大量的数据。 索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式。索引能够存储某种特殊字段或字段集的值,并按照索引指定的方式将字段值进行排序。

ensureIndex() 方法

要想创建索引,需要使用 MongoDB 的 ensureIndex() 方法。

语法格式

ensureIndex()方法的基本语法格式为: db.COLLECTION_NAME.ensureIndex({KEY:1}) 这里的 key 是想创建索引的字段名称,1 代表按升序排列字段值。-1 代表按降序排列。

范例

>db.mycol.ensureIndex({"title":1}) 

可以为 ensureIndex() 方法传入多个字段,从而为多个字段创建索引。

>db.mycol.ensureIndex({"title":1,"description":-1}) 

ensureIndex() 方法也可以接受一些可选参数,如下所示:

参数类型描述
background布尔值在后台构建索引,从而不干扰数据库的其他活动。取值为 true 时,代表在后台构建索引。默认值为 false
unique布尔值创建一个唯一的索引,从而当索引键匹配了索引中一个已存在值时,集合不接受文档的插入。取值为 true 代表创建唯一性索引。默认值为 false 。
name字符串索引名称。如果未指定,MongoDB 会结合索引字段名称和排序序号,生成一个索引名称。
dropDups布尔值在可能有重复的字段内创建唯一性索引。ongoDB 只在某个键第一次出现时进行索引,去除该键后续出现时的所有文档。
sparse布尔值如果为 true,索引只引用带有指定字段的文档。这些索引占据的空间较小,但在一些情况下的表现也不同(特别是排序)。默认值为 false 。
expireAfterSeconds整型值指定一个秒数值,作为 TTL 来控制 MongoDB 保持集合中文档的时间。
v索引版本索引版本号。默认的索引版本跟创建索引时运行的 MongoDB 版本号有关。
weights文档数值,范围从 1 到 99, 999。表示就字段相对于其他索引字段的重要性。
default_language字符串对文本索引而言,用于确定停止词列表,以及词干分析器(stemmer)与断词器(tokenizer)的规则。默认值为 english。
language_override字符串对文本索引而言,指定了文档所包含的字段名,该语言将覆盖默认语言。默认值为 language。

聚合

聚合操作能够处理数据记录并返回计算结果。聚合操作能将多个文档中的值组合起来,对成组数据执行各种操作,返回单一的结果。它相当于 SQL 中的 count(*) 组合 group by。

aggregate() 方法

对于 MongoDB 中的聚合操作,应该使用 aggregate()方法。

语法格式

aggregate() 方法中的基本格式如下所示: db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

范例

假如某个集合包含下列数据:

{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 }, { _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 10 }, { _id: ObjectId(7df78ad8902e) title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: ['neo4j', 'database', 'NoSQL'], likes: 750 } 

假如想从上述集合中,归纳出一个列表,以显示每个用户写的教程数量,需要像下面这样使用 aggregate() 方法:

> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}]) { "result" : [ { "_id" : "tutorials point", "num_tutorial" : 2 }, { "_id" : "Neo4j", "num_tutorial" : 1 } ], "ok" : 1 } 

假如用 SQL 来处理上述查询,则需要使用这样的命令:select by_user, count(*) from mycol group by by_user。 上例使用 by_user 字段来组合文档,每遇到一次 by_user,就递增之前的合计值。下面是聚合表达式列表。

表达式描述范例
$sum对集合中所有文档的定义值进行加和操作db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg对集合中所有文档的定义值进行平均值db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min计算集合中所有文档的对应值中的最小值db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max计算集合中所有文档的对应值中的最大值db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push将值插入到一个结果文档的数组中db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet将值插入到一个结果文档的数组中,但不进行复制db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first根据成组方式,从源文档中获取第一个文档。但只有对之前应用过 $sort 管道操作符的结果才有意义。db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last根据成组方式,从源文档中获取最后一个文档。但只有对之前进行过 $sort 管道操作符的结果才有意义。db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

管道的概念

在 UNIX 命令 Shell 中,管道(pipeline)概念指的是能够在一些输入上执行一个操作,然后将输出结果用作下一个命令的输入。MongoDB 的聚合架构也支持这种概念。管道中有很多阶段(stage),在每一阶段中,管道操作符都会将一组文档作为输入,产生一个结果文档(或者管道终点所得到的最终 JSON 格式的文档),然后再将其用在下一阶段。 聚合架构中可能采取的管道操作符有:

  • $project 用来选取集合中一些特定字段。
  • $match 过滤操作。减少用作下一阶段输入的文档的数量。
  • $group 如上所述,执行真正的聚合操作。
  • $sort 对文档进行排序。
  • $skip 在一组文档中,跳过指定数量的文档。
  • $limit 将查看文档的数目限制为从当前位置处开始的指定数目。
  • $unwind 解开使用数组的文档。当使用数组时,数据处于预连接状态,通过该操作,数据重新回归为各个单独的文档的状态。利用该阶段性操作可增加下一阶段性操作的文档数量。

复制

复制是一种在多个服务器上同步数据的过程。通过在不同的数据库服务器上实现多个数据副本,复制能够实现数据冗余,提高数据的可用性,从而避免了仅仅因为一台服务器故障后就会产生的数据库灾难。总之,复制可以使你免受硬件故障与服务中断的影响,及时恢复数据。由于数据有多个副本,所以可以将其中一个副本用于灾难恢复、报告或备份。

为什么需要复制

  • 保持数据安全
  • 保证数据的高可用性(24 小时 × 7 天,全年无休)
  • 灾难恢复
  • 无需停机维护(比如进行备份、索引重建,压缩等任务)
  • 读取的可扩展性(可读取其他副本)
  • 副本集对应用的公开性

复制在 MongoDB 中的运作方式

MongoDB 使用副本集(replica set)来实现复制操作。副本集是一组托管同一数据集的 mongod 对象。在副本集中,主节点负责接收写入操作。所有其他的实例(从节点)则通过执行主节点的操作来拥有同样的数据集。副本集中只有一个主节点。

  1. 副本集具有 2 个或多个节点(但一般最少需要 3 个节点)。
  2. 副本集只有一个主节点,其他全是从节点。
  3. 所有数据都是从主节点复制到从节点上的。
  4. 当发生自动故障转移或维护时,会重新推举一个新的主节点。
  5. 当失败节点恢复后,该节点重新又连接到副本集中,重新作为从节点。 下图展示了一个典型的 MongoDB 复制图。客户端应用总是跟主节点交互,主节点将数据复制到从节点上。

replication.png

副本集特点

  • 具有 N 个节点的集群
  • 任何节点都可能成为主节点
  • 所有写入操作必须由主节点来完成
  • 自动故障转移
  • 自动故障恢复
  • 重新推举主节点

建立副本集

在本教程中,我们将把单独的一个 mongod 实例转变为副本集,步骤如下:

  1. 关闭正在运行的 MongoDB 服务器。
  2. 指定 --replSet 选项来开启 MongoDB 服务器。--replSet 的基本格式如下: mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"

范例

mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0 该命令会在端口 27017 处启动一个名为 rs0 的 MongoDB 实例。在命令行提示符上输入命令连接到该 MongoDB 对象上。在 MongoDB 客户端使用 rs.initiate() 命令来初始化一个新的副本集。检查该副本集设置,则需使用 rs.conf()。检查副本集状态使用 rs.status()

为副本集添加成员

为了向副本集添加成员,在多台机器上开启多个 MongoDB 实例。开启一个 MongoDB 客户端,然后使用 rs.add() 命令。

语法格式

基本的 rs.add() 命令语法格式如下所示: >rs.add(HOST_NAME:PORT)

范例

假设 MongoDB 实例名称为 mongodb1.net,且运行在 27017 端口处。为了将该实例添加到副本集中,请在 MongoDB 客户端中使用 rs.add()。 rs.add("mongod1.net:27017") 只有当连接到主节点上时,才能向副本集中添加 MongoDB 实例。要想查看是否连接的是主节点,请在 MongoDB 客户端上使用 db.isMaster() 命令。

分片

分片是一种在多台机器上存储数据记录的操作,它是 MongoDB 为应对数据增长需求而采取的办法。当数据量增长时,单台机器有可能无法存储数据或可接受的读取写入吞吐量。通过横向扩展,分片技术解决了这个问题。利用分片技术,我们可以添加更多的机器来应对数据量增加以及读写操作的要求。

为何要分片

  • 将所有的写入操作复制到主节点
  • 对延迟敏感的查询将在主节点上完成
  • 单个副本集的节点数限制为 12 个
  • 当活跃数据集过大时,内存有可能不够
  • 本地磁盘空间不足
  • 纵向扩展太过昂贵

MongoDB 中的分片

下图展示了 MongoDB 使用分片集群的情形:

sharding.png

在上图中,有三个组件值得说明:

  • 分片 分片用来存储数据。它们提供了高可用性与数据一致性。在生产环境中,每个分片都是一个独立的副本集。
  • 配置服务器 配置服务器(Config server)保存着集群的元数据。该数据含有集群数据集到分片的映射关系。查询路由使用该元数据来定位特定分片的操作。在生产环境中,分片集群具有 3 个配置服务器。
  • 查询路由 查询路由(Query Router)基本上就是 mongos 实例,是客户端的接口,直接操作适当的分片。查询路由定位并处理对分片的操作,并将结果返回至客户端。分片集群可能含有多个查询路由,以便分散客户端请求负载。一个客户端请求对应着一个查询路由。通常一个分片集群可能有很多查询路由。

创建备份

MongoDB 数据转储

为了在 MongoDB 中创建数据库备份,需要使用 mongodump 命令。该命令会将服务器上的所有数据都转储到 dump 目录中。你可以使用很多选项来限制转储的数据量,或者创建远程服务器备份。

语法格式

mongodump 命令的基本语法格式为: mongodump

范例

开启 mongod 服务器。假设 mongod 服务器运行在 localhost 上,端口为 27017。在命令行上输入命令,在 MongoDB 实例的 bin 目录下输入 mongodump 命令。 假设 mycol 集合包含如下数据: >mongodump 上述命令会连接在 127.0.0.1 运行的服务器(端口为 27017),将所有数据备份到 /bin/dump 上。命令输出结果如下图所示:

mongodump.png

mongodump 命令其实包含很多选项。

语法格式描述范例
mongodump --host HOST_NAME --port PORT_NUMBER该命令将指定 mongod 实例上的所有数据库都进行了备份mongodump --host tutorialspoint.com --port 27017
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY-mongodump --dbpath /data/db/ --out /data/backup/
mongodump --collection COLLECTION --db DB_NAME该命令只备份那些指定路径上的指定数据库mongodump --collection mycol --db test

重新恢复数据

恢复备份数据使用 mongorestore 命令,该命令将备份目录中的所有数据给予恢复。

语法格式

mongorestore 命令的基本语法格式为: > mongorestore 该命令输入结果如下图所示:

mongorestore.png

部署

在准备一个 MongoDB 部署时,应该先了解一下应用是如何在生产环境中运行的。使用一个持久性可重复的策略来管理部署环境无疑是很有用的,它将减少你在生产环境中遇到意外麻烦的可能性。 最佳的策略应包括以下几点:规划设置原型,执行负载测试,监控关键参数,并使用该信息来扩展设置。关键在于积极监控整个系统,这能有助于了解生产系统在部署前的运作方式,确定该在何处添加功能。例如,意识到了内存使用中的潜在峰值,就有可能及时地防止写锁定情况的出现。 为了监控部署,MongoDB 提供了多种命令。

mongostat

该命令检查所有运行中的 mongod 实例的状态,返回数据库操作的统计结果。这些统计命令包括插入数、查询数、更新数、删除数以及游标的操作等。有些命令还能显示碰到页面错误的时间,以及写锁的时间百分比。这意味着你遇到一些问题:内存低,写入及性能上出现了一些问题。 先运行 mongod 实例,然后在另一个命令行提示符中输入命令,在 mongodb 安装目录的 bin 目录下输入 mongostatD:\set up\mongodb\bin>mongostat

mongotop

该命令能够记录并报告 MongoDB 实例基于每个集合的读写活动。mongotop 默认每秒返回一次结果,但我们可以修改间隔时间。你应该检查读写活动是否符合应用预期状态。理想情况下,不应该出现对数据库进行过多的写操作,过于频繁地读取磁盘,或者超出了工作集的容量等情况。 先运行 mongod 实例,然后在另一个命令行提示符中输入命令,在 mongodb 安装目录的 bin 目录下输入 mongotopD:\set up\mongodb\bin>mongotop

要想使 mongotop 命令返回信息的间隔时间变长,可以在 mongotop 命令的后面指定一个数字。 D:\set up\mongodb\bin>mongotop 30 上述命令表示每 30 秒返回数值。 除了 mongodb 工具之外,10gen 还提供了免费的托管监控服务:MongoDB Management Service(MMS)。通过它所提供的仪表板,你可以查看整个集群的各个参数。

Java

安装

要想在 Java 程序中使用 MongoDB,需要先确定是否安装了 MongoDB JDBC 驱动,并且要在机器上安装了 Java。查看 Java 教程来确保在机器上安装好 Java。下面来介绍如何安装 MongoDB JDBC 驱动。

  • 从路径 Download mongo.jar 处下载 jar 文件,注意下载最新版本。
  • 在类路径中包括 mongo.jar 文件。

连接数据库

为了连接数据库,需要指定数据库名称,如果数据库不存在,mongodb 就会自动创建它。 连接数据库的代码段如下所示:

import com.mongodb.MongoClient;  import com.mongodb.MongoException;  import com.mongodb.WriteConcern;  import com.mongodb.DB;  import com.mongodb.DBCollection;  import com.mongodb.BasicDBObject;  import com.mongodb.DBObject;  import com.mongodb.DBCursor;  import com.mongodb.ServerAddress;  import java.util.Arrays;  public class MongoDBJDBC{          public static void main( String args[] ){                  try{                         // To connect to mongodb server                          MongoClient mongoClient = new MongoClient( "localhost" , 27017 );                         // Now connect to your databases                          DB db = mongoClient.getDB( "test" );                          System.out.println("Connect to database successfully");                          boolean auth = db.authenticate(myUserName, myPassword);                          System.out.println("Authentication: "+auth);                  }catch(Exception e){                          System.err.println( e.getClass().getName() + ": " + e.getMessage() );                  }          }  } 

下面编译并运行上面的程序,以便测试数据库。可以针对每个需求改变路径。假设当前 JDBC 驱动版本 mongo-2.10.1.jar 可用于当前路径。

$javac MongoDBJDBC.java  $java -classpath ".:mongo-2.10.1.jar" MongoDBJDBC  Connect to database successfully  Authentication: true 

如果想使用 Windows 系统的机器,则编译并执行代码如下:

$javac MongoDBJDBC.java  $java -classpath ".;mongo-2.10.1.jar" MongoDBJDBC  Connect to database successfully  Authentication: true 

如果选定数据库的用户名及密码有效,则 auth 值为 true。

创建集合

创建集合需要使用 com.mongodb.DB 类的 createCollection() 方法。 创建集合的代码段如下所示:

import com.mongodb.MongoClient;  import com.mongodb.MongoException;  import com.mongodb.WriteConcern;  import com.mongodb.DB;  import com.mongodb.DBCollection;  import com.mongodb.BasicDBObject;  import com.mongodb.DBObject;  import com.mongodb.DBCursor;  import com.mongodb.ServerAddress;  import java.util.Arrays;  public class MongoDBJDBC{          public static void main( String args[] ){                  try{                 // To connect to mongodb server                          MongoClient mongoClient = new MongoClient( "localhost" , 27017 );                         // Now connect to your databases                          DB db = mongoClient.getDB( "test" );                  System.out.println("Connect to database successfully");                          boolean auth = db.authenticate(myUserName, myPassword);                  System.out.println("Authentication: "+auth);                          DBCollection coll = db.createCollection("mycol");                          System.out.println("Collection created successfully");                  }catch(Exception e){                          System.err.println( e.getClass().getName() + ": " + e.getMessage() );                  }         }  } 

编译并执行该程序,结果如下所示:

Connect to database successfully  Authentication: true  Collection created successfully 

获取/选择一个集合

从数据库中获取/选择一个集合,使用 com.mongodb.DBCollection 类的 getCollection() 方法。代码段如下:

import com.mongodb.MongoClient;  import com.mongodb.MongoException;  import com.mongodb.WriteConcern; import com.mongodb.DB;  import com.mongodb.DBCollection;  import com.mongodb.BasicDBObject;  import com.mongodb.DBObject; import com.mongodb.DBCursor;  import com.mongodb.ServerAddress;  import java.util.Arrays;  public class MongoDBJDBC{          public static void main( String args[] ){                  try{                 // To connect to mongodb server                          MongoClient mongoClient = new MongoClient( "localhost" , 27017 );                         // Now connect to your databases                          DB db = mongoClient.getDB( "test" );                  System.out.println("Connect to database successfully");                          boolean auth = db.authenticate(myUserName, myPassword);                  System.out.println("Authentication: "+auth);                          DBCollection coll = db.createCollection("mycol");                          System.out.println("Collection created successfully");                          DBCollection coll = db.getCollection("mycol");                          System.out.println("Collection mycol selected successfully");                  }catch(Exception e){                          System.err.println( e.getClass().getName() + ": " + e.getMessage() );                  }          } } 

编译并执行该程序,结果如下所示:

Connect to database successfully  Authentication: true  Collection created successfully  Collection mycol selected successfully 

插入文档

插入文档使用 com.mongodb.DBCollection 类的 insert() 方法。代码段如下所示:

import com.mongodb.MongoClient; import com.mongodb.MongoException; import com.mongodb.WriteConcern; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mongodb.DBCursor; import com.mongodb.ServerAddress; import java.util.Arrays;  public class MongoDBJDBC{    public static void main( String args[] ){       try{         // To connect to mongodb server          MongoClient mongoClient = new MongoClient( "localhost" , 27017 );          // Now connect to your databases          DB db = mongoClient.getDB( "test" );      System.out.println("Connect to database successfully");          boolean auth = db.authenticate(myUserName, myPassword);      System.out.println("Authentication: "+auth);                   DBCollection coll = db.getCollection("mycol");          System.out.println("Collection mycol selected successfully");          DBCursor cursor = coll.find();          int i=1;          while (cursor.hasNext()) {              System.out.println("Inserted Document: "+i);              System.out.println(cursor.next());              i++;          }       }catch(Exception e){          System.err.println( e.getClass().getName() + ": " + e.getMessage() );       }    } } 

编译并执行该程序,结果如下所示:

Connect to database successfully Authentication: true Collection mycol selected successfully Document inserted successfully 

检索所有文档

选择集合中的所有文档,使用 com.mongodb.DBCollection 类的 find() 方法。该方法返回一个游标,所以需要迭代该游标。 选择所有文档的代码如下所示:

import com.mongodb.MongoClient; import com.mongodb.MongoException; import com.mongodb.WriteConcern; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mongodb.DBCursor; import com.mongodb.ServerAddress; import java.util.Arrays;  public class MongoDBJDBC{    public static void main( String args[] ){       try{         // To connect to mongodb server          MongoClient mongoClient = new MongoClient( "localhost" , 27017 );          // Now connect to your databases          DB db = mongoClient.getDB( "test" );      System.out.println("Connect to database successfully");          boolean auth = db.authenticate(myUserName, myPassword);      System.out.println("Authentication: "+auth);                   DBCollection coll = db.getCollection("mycol");          System.out.println("Collection mycol selected successfully");          DBCursor cursor = coll.find();          while (cursor.hasNext()) {              DBObject updateDocument = cursor.next();             updateDocument.put("likes","200")             col1.update(updateDocument);           }          System.out.println("Document updated successfully");          cursor = coll.find();          int i=1;          while (cursor.hasNext()) {              System.out.println("Updated Document: "+i);              System.out.println(cursor.next());              i++;          }       }catch(Exception e){          System.err.println( e.getClass().getName() + ": " + e.getMessage() );       }    } } 

编译并执行程序的结果如下:

Connect to database successfully Authentication: true Collection mycol selected successfully Document updated successfully Updated Document: 1 {    "_id" : ObjectId(7df78ad8902c),    "title": "MongoDB",    "description": "database",    "likes": 100,    "url": "http://www.tutorialspoint.com/mongodb/",    "by": "tutorials point" }  

更新文档

更新集合中的文档,使用 com.mongodb.DBCollection 类的 update() 方法。代码如下所示:

import com.mongodb.MongoClient; import com.mongodb.MongoException; import com.mongodb.WriteConcern; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mongodb.DBCursor; import com.mongodb.ServerAddress; import java.util.Arrays;  public class MongoDBJDBC{    public static void main( String args[] ){       try{         // To connect to mongodb server          MongoClient mongoClient = new MongoClient( "localhost" , 27017 );          // Now connect to your databases          DB db = mongoClient.getDB( "test" );      System.out.println("Connect to database successfully");          boolean auth = db.authenticate(myUserName, myPassword);      System.out.println("Authentication: "+auth);                   DBCollection coll = db.getCollection("mycol");          System.out.println("Collection mycol selected successfully");          DBCursor cursor = coll.find();          while (cursor.hasNext()) {              DBObject updateDocument = cursor.next();             updateDocument.put("likes","200")             col1.update(updateDocument);           }          System.out.println("Document updated successfully");          cursor = coll.find();          int i=1;          while (cursor.hasNext()) {              System.out.println("Updated Document: "+i);              System.out.println(cursor.next());              i++;          }       }catch(Exception e){          System.err.println( e.getClass().getName() + ": " + e.getMessage() );       }    } } 

程序编译及运行结果如下:

Connect to database successfully Authentication: true Collection mycol selected successfully Document updated successfully Updated Document: 1 {    "_id" : ObjectId(7df78ad8902c),    "title": "MongoDB",    "description": "database",    "likes": 100,    "url": "http://www.tutorialspoint.com/mongodb/",    "by": "tutorials point" } 

删除第一个文档

删除集合中的第一个文档,需要使用 findOne() 方法选中第一个文档,然后使用 com.mongodb.DBCollection 类的 remove 方法将其删除。代码范例如下:

import com.mongodb.MongoClient; import com.mongodb.MongoException; import com.mongodb.WriteConcern; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mongodb.DBCursor; import com.mongodb.ServerAddress; import java.util.Arrays;  public class MongoDBJDBC{    public static void main( String args[] ){       try{         // To connect to mongodb server          MongoClient mongoClient = new MongoClient( "localhost" , 27017 );          // Now connect to your databases          DB db = mongoClient.getDB( "test" );      System.out.println("Connect to database successfully");          boolean auth = db.authenticate(myUserName, myPassword);      System.out.println("Authentication: "+auth);                   DBCollection coll = db.getCollection("mycol");          System.out.println("Collection mycol selected successfully");          DBObject myDoc = coll.findOne();          col1.remove(myDoc);          DBCursor cursor = coll.find();          int i=1;          while (cursor.hasNext()) {              System.out.println("Inserted Document: "+i);              System.out.println(cursor.next());              i++;          }          System.out.println("Document deleted successfully");       }catch(Exception e){          System.err.println( e.getClass().getName() + ": " + e.getMessage() );       }    } } 

程序编译并执行结果如下所示:

Connect to database successfully Authentication: true Collection mycol selected successfully Document deleted successfully 

PHP

要想在 MongoDB 上使用 PHP,需要使用 mongodb PHP 驱动。从该链接处下载 PHP 驱动。确保下载的是最新版。将其解压缩,并将 php_mongo.dll 文件放到 PHP 扩展目录中(默认为 “ext”),然后把下列代码放到 php.ini 文件中: extension=php_mongo.dll

创建连接并选择数据库

创建连接需要指定数据库名称,如果数据库不存在,则 mongodb 会自动创建它。 连接数据库的代码如下所示:

<?php    // connect to mongodb    $m = new MongoClient();    echo "Connection to database successfully";    // select a database    $db = $m->mydb;    echo "Database mydb selected"; ?> 

该程序的执行结果如下所示:

Connection to database successfully Database mydb selected 

创建集合

创建集合的代码如下所示:

<?php    // connect to mongodb    $m = new MongoClient();    echo "Connection to database successfully";    // select a database    $db = $m->mydb;    echo "Database mydb selected";    $collection = $db->createCollection("mycol");    echo "Collection created succsessfully"; ?> 

执行程序的结果如下所示:

Connection to database successfully Database mydb selected Collection created succsessfully 

插入文档

插入文档使用 insert() 方法。

<?php    // connect to mongodb    $m = new MongoClient();    echo "Connection to database successfully";    // select a database    $db = $m->mydb;    echo "Database mydb selected";    $collection = $db->mycol;    echo "Collection selected succsessfully";    $document = array(        "title" => "MongoDB",        "description" => "database",        "likes" => 100,       "url" => "http://www.tutorialspoint.com/mongodb/",       "by", "tutorials point"    );    $collection->insert($document);    echo "Document inserted successfully"; ?> 

执行程序的结果如下所示:

Connection to database successfully Database mydb selected Collection selected succsessfully Document inserted successfully 

寻找所有文档

选择集合中的所有文档,使用 find() 方法。

<?php    // connect to mongodb    $m = new MongoClient();    echo "Connection to database successfully";    // select a database    $db = $m->mydb;    echo "Database mydb selected";    $collection = $db->mycol;    echo "Collection selected succsessfully";     $cursor = $collection->find();    // iterate cursor to display title of documents    foreach ($cursor as $document) {       echo $document["title"] . "\n";    } ?> 

程序执行的结果如下所示:

Connection to database successfully Database mydb selected Collection selected succsessfully {    "title": "MongoDB" } 

更新文档

更新文档使用 update() 方法。 下例将把插入文档的标题改为 MongoDB Tutorial。代码段如下所示:

<?php    // connect to mongodb    $m = new MongoClient();    echo "Connection to database successfully";    // select a database    $db = $m->mydb;    echo "Database mydb selected";    $collection = $db->mycol;    echo "Collection selected succsessfully";     // now update the document    $collection->update(array("title"=>"MongoDB"), array('$set'=>array("title"=>"MongoDB Tutorial")));    echo "Document updated successfully";    // now display the updated document    $cursor = $collection->find();    // iterate cursor to display title of documents    echo "Updated document";    foreach ($cursor as $document) {       echo $document["title"] . "\n";    } ?> 

程序执行的结果如下所示:

Connection to database successfully Database mydb selected Collection selected succsessfully Document updated successfully Updated document {    "title": "MongoDB Tutorial" } 

删除文档

删除文档使用 remove() 方法。 下例中将把标题为 MongoDB Tutorial 的文档全部删除。代码如下所示:

<?php    // connect to mongodb    $m = new MongoClient();    echo "Connection to database successfully";    // select a database    $db = $m->mydb;    echo "Database mydb selected";    $collection = $db->mycol;    echo "Collection selected succsessfully";     // now remove the document    $collection->remove(array("title"=>"MongoDB Tutorial"),false);    echo "Documents deleted successfully";     // now display the available documents    $cursor = $collection->find();    // iterate cursor to display title of documents    echo "Updated document";    foreach ($cursor as $document) {       echo $document["title"] . "\n";    } ?> 

程序执行的结果如下所示:

Connection to database successfully Database mydb selected Collection selected succsessfully Documents deleted successfully  

在上述范例中,第二个参数是布尔值类型,用于 remove() 方法的 justOne 字段。

本文发表于2017年10月31日 10:34
(c)注:本文转载自https://my.oschina.net/kangvcar/blog/1558252,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1990 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1