MongoDB数据库操作
连接、数据库和集合是一些最重要的MongoDB服务器组件。
本节介绍MongoDB shell中的Connection、Database和Collection对象,它们是MongoDB服务器中实际组件的接口,让您能够与这些实际组件交互。
- 连接到MongoDB数据库;
- 在MongoDB shell中建立到MongoDB服务器的连接;
- 在MongoDB shell中创建、查看和删除数据库;
- 查看MongoDB数据库的大小、集合数以及其他统计信息;
- 在MongoDB shell中创建、查看和删除集合。
理解Database和Collection对象
MongoDB shell与MongoDB服务器、数据库和集合交互时严重依赖于结构化对象。这些对象表示到MongoDB的连接、数据库和集合,它们提供了接口,让您能够连接和管理数据库以及创建和管理集合。
理解Connection对象
MongoDB shell中的Connection对象让您能够访问MongoDB服务器,它表示到服务器的连接,让您能够获取Database对象并设置读取首选项。 要创建连接到MongoDB服务器的Connection对象,可使用如下命令:
Mongo(host:port)
例如,要连接到本地主机的MongoDB服务器,并创建一个Connection对象,可使用下面的代码行:
var myConn = new Mongo("localhost");
Connection对象的方法
- new Mongo(host:port) 连接到指定位置的MongoDB实例,并返回一个Connection对象实例
- getDB(database) 返回一个Database对象,它表示参数database指定的数据库
- setReadPrefMode(mode, tagSet) 设置副本集读取首选模式。参数mode可以是primary、primaryPreferred、secondary、secondaryPreferred或nearest;参数tagSet是一个副本集标记集(tag set)数组
- getReadPrefMode() 返回MongoDB副本集的当前读取首选模式
- getReadPrefTagSet() 返回MongoDB副本集的当前读取首选标记集
- setSlaveOk() 允许从副本集的备份(secondary)成员读取
理解Database对象
MongoDB shell中的Database对象让您能够访问数据库。它表示一个数据库,让您能够执行诸如添加用户和访问集合等操作。您经常使用Database对象来访问MongoDB数据库。
要在MongoDB shell中创建Database对象,可使用两种方式之一。最简单的方法是,启动MongoDB shell,再使用下面的命令连接到
use <database>
在MongoDB shell中,这个命令连接到指定的数据库并修改变量db;这样您就可使用变量db来访问数据库功能了。例如,下面的命令连接到数据库myDB并显示其名称:
use myDB
db.getName()
您还可以使用Connection对象的方法getDB()来创建一个Database对象,例如,下面的JavaScript代码连接到数据库myDB,并使用创建的Database对象来显示数据库的名称:
myConn = new Mongo("localhost");
myDB = myConn.getDB("myDB");
myDB.getName();
Database对象的一些常用方法
- addUser(document) 根据指定的用户配置文档在数据库中添加一个用户
- auth(username, password) 向数据库验证用户的身份
- changeUserPassword( username, password) 修改既有用户的密码
- cloneCollection(fromHost, collection, query) 从MongoDB服务器fromHost复制指定的集合到当前数据库中。可选参数query指定了一个查询,该查询决定了要克隆集合中的哪些文档
- cloneDatabase(host) 从远程主机复制一个数据库到当前主机
- commandHelp(command) 返回数据库命令的帮助信息
- copyDatabase(srcDatabase, destDatabase, host) 将远程主机中的数据库srcDatabase复制到当前主机,并重命名为destDatabase
- createCollection(name, options) 新建一个集合。参数options让您能够指定集合选项,如创建固定集合时
- dropDatabase() 删除当前数据库
- eval(function, arguments) 向MongoDB服务器发送一个JavaScript函数(由第一个参数指定),并在服务器处执行;传递给这个函数的参数由后续参数指定。这让您能够在服务器上执行代码,避免将大量的数据传输到MongoDB shell
- getCollection(collection) 返回一个表示指定集合的Collection对象,这在集合无法使用MongoDB shell语法访问(如集合名包含空格)时很有用
- getCollectionNames() 列出当前数据库中所有的集合
- getMongo() 返回表示当前连接的Connection对象
- getName() 返回当前数据库的名称
- getSiblingDB(database) 返回一个Database对象,它表示当前服务器中的另一个数据库
- help() 显示Database对象的常用方法的描述
- hostInfo() 返回一个文档,其中包含运行MongoDB的系统的信息
- logout() 结束到当前数据库的经过身份验证的会话
- removeUser(username) 将用户从数据库中删除
- repairDatabase() 对当前数据库执行修复例程
- runCommand(command) 运行数据库命令。这是执行数据库命令的首选方法,因为它为MongoDB shell和驱动程序提供了一致的接口
- serverStatus() 返回一个文档,其中包含有关数据库进程状态的摘要信息
- shutdownServer() 干净而安全地关闭当前mongod或mongos进程
- version() 返回mongod实例的版本
理解Collection对象
Collection对象表示MongoDB数据库中的集合,您可使用它来访问集合中的文档、添加文档、查询文档等。 访问集合的方式有两种。如果集合的名称是MongoDB shell JavaScript语法支持的,可使用句点表示法通过Database对象直接访问,例如,下面的代码显示集合myCollection的统计信息:
db.myCollection.stats()
您还可使用Database对象的方法getCollection()来创建Collection对象实例,如下所示:
myColl = db.getCollection("myCollection");
myColl.stats()
Collection对象的基本方法。这些方法让您能够在集合中添加和修改文档、查找文档以及删除集合。
- aggregate() 让您能够访问聚合流水线
- count() 返回集合中的文档数或满足查询条件的文档数
- copyTo(newCollection) 将当前集合中的文档复制到当前服务器中的另一个集合中
- createIndex() 使用ensureIndex()为集合创建索引
- dataSize() 返回集合的大小
- distinct(field, query) 根据参数query指定的查询返回一个文档数组,这些文档包含指定字段的不同值
- drop() 从数据库中删除指定的集合
- dropIndex(index) 从集合中删除指定的索引
- dropIndexes() 删除当前集合的所有索引
- ensureIndex(keys, options) 创建一个索引——如果它不存在
- find(query, projection) 对集合执行查询并返回一个Cursor对象
- findAndModify(document) 以原子方式修改并返回一个文档
- findOne(query, projection) 执行查询并返回一个文档
- getIndexes() 返回一个文档数组,这些文档描述集合的索引
- group(document) 提供一种基本聚合,即根据指定的字段将文档分组
- insert(document) 在集合中插入新文档
- isCapped() 如果集合为固定集合,就返回true,否则返回false
- mapReduce(map, reduce, options) 提供映射-归并聚合功能
- reIndex() 重建集合的所有索引
- remove(query, justOne) 将集合中满足查询条件(由参数query指定)的文档删除;如果参数justOne为true,则只删除第一个满足条件的文档
- renameCollection(target, dropTarget) 将当前集合的名称改为target指定的名称。如果参数dropTarget为true,将在重命名当前集合前删除集合target
- save(document) 包装了insert()和update(),用于插入新文档。如果文档不存在,就插入它;否则就更新它
- stats() 返回一个文档,其中包含有关集合的统计信息
- storageSize() 返回一个文档,指出了集合占用的总存储空间,单位为字节
- totalSize() 返回一个文档,指出了集合的总空间,包括集合中所有文档和索引的大小
- totalIndexSize() 返回一个文档,指出了集合索引占据的总空间
- update(query, update, options) 修改集合中的一个或多个文档
- validate() 对集合执行诊断操作
管理数据库
理解Database和Collection对象后,便可以开始管理数据库了。
显示数据库列表
您可能需要查看已创建的数据库列表,在您创建了大量数据库或有多人负责管理系统时尤其如此。要查看系统中的数据库列表,可使用命令show dbs,它显示已创建的数据库列表。 如果你想查看所有数据库,可以使用 show dbs 命令:
show dbs
注意: 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
切换到其他数据库
在MongoDB shell中执行数据库操作时,使用的是内置的db句柄。很多操作都只能针对一个数据库;要操作其他数据库,必须修改db句柄,使其指向相应的数据库。
要切换到其他数据库,可使用方法db.getSiblingDB(database)或命令use
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。
创建数据库
MongoDB没有提供显式地创建数据库的MongoDB shell命令。数据库是在添加集合或用户时隐式地创建的。
要创建数据库,可使用use
use newDB
db.createCollection("newCollection")
要使用JavaScript脚本创建数据库,可使用Connection对象创建一个Database对象实例,再在其中添加集合,如下所示:
myConn = new Mongo("localhost");
newDB = myConn.getDB("newDB");
newDB.createCollection("newCollection");
删除数据库
数据库创建后,它将一直存在于MongoDB中,直到管理员将其删除。在有些系统上,删除数据库是一种常见的任务,在创建数据库用于存储临时数据时尤其如此。有时候,将过期的数据库删除再创建一个新的,比清空数据库的内容更容易。 要在MongoDB shell中删除数据库,可使用方法dropDatabase()。例如,要删除数据库newDB,可使用下面的命令切换到该数据库再将其删除:
use newDB
db.dropDatabase()
请注意,方法dropDatabase()删除当前数据库,但不会修改当前数据库句柄。删除数据库后,如果您在没有切换到其他数据库的情况下创建集合,将重新创建被删除的数据库。 要使用JavaScript脚本删除数据库,可使用Connection对象创建一个Database对象实例,再对其调用方法dropDatabase(),如下所示:
myConn = new Mongo("localhost");
myDB = myConn.getDB("newDB");
myDB.dropDatabase()
获取MongoDB数据库的统计信息
Database对象另一项很有用的功能是,让您能够获取特定数据库的统计信息。通过信息让您能够知道数据库包含的集合数、数据库大小、索引数等。在需要编写代码定期地检查数据库的统计信息,以确定数据库是否需要清理时,这些信息特别有用。 要获取数据库的统计信息,可使用Database对象的方法stats(),如下所示:
stats = db.stats()
管理集合
有时候需要管理数据库中的集合。MongoDB在MongoDB shell中提供了创建、查看和操作集合的功能。
显示数据库的集合列表
您经常需要查看数据库中的集合列表。例如,您可能需要核实某个集合是否存在或获悉忘记了的集合名。 要在MongoDB shell中查看数据库中的集合列表,需要切换到相应的数据库,再使用 show collections列出该数据库中的集合。例如,下面的命令列出数据库test中的集合:
use test
show collections
您还可使用Database对象的方法getCollectionNames(),这将返回一个集合名数组,如下所示:
use test
collectionNames = db.getCollectionNames()
创建集合
要存储文档,必须在MongoDB数据库中创建集合,为此需要使用数据库句柄调用方法createCollection(name, [options])。其中参数name是要创建的数据库的名称,而可选参数options是一个对象,可使用表5.4所示的属性来定义集合的行为。 创建集合时可指定的选项
- capped 布尔值。为true时将创建一个固定集合,其大小不能超过属性size指定的值。默认为false
- autoIndexID 布尔值。为true时将自动为加入到集合中的每个文档创建_id字段,并根据这个字段创建一个索引。对于固定集合,应将这个属性设置为false。默认为true
- size 指定固定集合的大小,单位为字节。
- max 指定固定集合最多可包含多少个文档。为给新文档腾出空间,将删除最旧的文档
例如,下面的命令在数据库testDB中新建一个集合:
use testDB db.createCollection("newCollection")
下面的代码行在数据库testDB中新建一个名为newCollection的集合,并将autoIndexID设置成了false:
use testDB
db.createCollection("newCollection", {autoIndexID: false})
删除集合
有时还需删除不再需要的旧集合。删除旧集合可释放磁盘空间,消除与这些集合相关的开销,如索引。 要在MongoDB shell中删除集合,需要切换到相应的数据库,再对集合调用函数drop()。 通常,可使用集合名和句点语法来访问集合。例如,下面的代码从当前数据库中删除集合newCollection:
use testDB
db.newCollection.drop()
您还可以使用getCollection()来获取Collection对象,再对其调用方法drop(),对于MongoDB shell句点语法不支持的集合名,这很有用。例如,下面的代码也从数据库testDB中删除集合newCollection:
use testDB
coll = db.getCollection("newCollection")
coll.drop()