这篇教程介绍了使用 mongo shell进行基本的数据库操作。 mongo 是MongoDB发行版本的一部分,它为MongoDB提供了一个可对JavaScript语言和所有标准功能进行完全访问的完整的JavaScript环境以及一个完整的数据库接口。参见 mongo JavaScript API 文档和 mongo shell JavaScript Method Reference.
这篇教程假设你在Linux或者OS X操作系统上运行MongoDB并且你有一个运行的数据库服务器;MongoDB也支持Windows并为Windows版本提供了一致的操作。如果你想要安装MongoDB并启动数据库服务器的指导请参见更详细的 安装 文档。
本教程讨论了MongoDB在以下几个方面的使用:
- 连接数据库
- 连接mongod
- 选择一个数据库
- 显示mongo帮助
- 创建一个集合并插入文档
- 插入单个文档
- 使用循环插入多个文档
- 使用游标
- 遍历游标进行循环操作
- 使用游标进行数组操作
- 查询指定的文档
- 从集合中返回单个文档
- 限制结果集中的文档数目
- 下一步
本节你将连接到作为 mongod运行的数据库服务器,并且开始使用 mongo shell在数据库实例中选择一个逻辑数据库以及在 mongo shell中访问帮助文本。
连接一个mongod
mongo
默认情况下, mongo 会寻找在本地接口的 27017 端口监听的数据库服务器。想要连接运行于不同端口或接口的服务器,可以使用 --port 和 --host 选项.
选择一个数据库
启动 mongo shell后你的会话将会默认使用test数据库用于上下文。任何时侯在 mongo 中输入以下指令都会显示当前数据库:
db
db返回当前数据库的名称.
-
在 mongo shell中使用以下指令展示数据库列表:
show dbs
-
使用以下命令切换到一个名为mydb的新的数据库:
use mydb
- 使用 db操作指令确认你的会话使用了 mydb 数据库作为上下文, 它会返回当前数据库的名称:
db
这个时候如果你再次输入 show dbs操作指令, 结果将不会包含 mydb,因为如果你不插入数据到那个数据库当中,MongoDB将不会创建数据库。创建一个集合并插入文档这节描述了插入数据的过程。
2.4版本的新特性: show databases 也会返回数据库列表.
展示 mongo 帮助文本
在任何时候你都可以在 mongo shell中使用以下操作来获取帮助文本:
help
除此之外,你可以将.help()追加到某些JavaScript方法、任何游标对象以及 db 和db.collection 对象来返回额外的帮助信息。
创建一个集合并插入文档
本节你将学会向mydb这个新的数据库中的things这个新的集合中插入文档。
MongoDB将会在第一次使用的时候隐式地创建集合和数据库: 在插入数据之前你不需要创建数据库或是集合。除此之外, 由于MongoDB使用动态模式 在将文档插入到集合之前你不需要指定文档的结构。
插入单个文档
-
在mongo shell中使用如下操作指令来确认当前上下文是 mydb 数据库:
db
-
如果在前一个操作指令 mongo 没有返回 mydb , 使用如下操作指令来设置上下文为 mydb 数据库:
use mydb
-
使用以下JavaScript操作序列来创建j 和 k这两个文档:
j = { name : "mongo" } k = { x : 3 }
-
使用以下操作序列插入 j 和 k 这两个文档到集合 things 中:
db.things.insert( j ) db.things.insert( k )
当插入第一个文档时, mongod 会创建 mydb数据库和 things 集合。
-
使用以下操作确认things 集合存在:
show collections
mongo shell将返回当前(即 mydb) 数据库中的集合列表。在任何时候, 仅有的集合为 things。所有的 mongod 数据库还有一个 system.indexes 集合。
-
在 things集合上执行查询操作来确认文档存在于集合things中。类似以下这样在一个操作中使用 find() 方法:
db.things.find()
操作返回以下结果。 ObjectId 值将是唯一的:
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" } { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
所有MongoDB 文档必须有一个拥有唯一值的 _id 字段。这些操作不会显示地为 _id 字段指定一个值, 所以 mongo 在将其插入集合之前为那个字段创建一个唯一的ObjectId 值 。
使用循环插入多个文档
-
在 mongo shell中可以使用for循环添加多个文档到 things 集合中:
for (var i = 1; i <= 20; i++) db.things.insert( { x : 4 , j : i } )
-
使用以下命令查询集合:
db.things.find()
mongo shell 展示集合中第一批20 个文档. ObjectId 值是不一样的:
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" } { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 } { "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 } { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 } { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 } { "_id" : ObjectId("4c220a42f3924d31102bd85b"), "x" : 4, "j" : 6 } { "_id" : ObjectId("4c220a42f3924d31102bd85c"), "x" : 4, "j" : 7 } { "_id" : ObjectId("4c220a42f3924d31102bd85d"), "x" : 4, "j" : 8 } { "_id" : ObjectId("4c220a42f3924d31102bd85e"), "x" : 4, "j" : 9 } { "_id" : ObjectId("4c220a42f3924d31102bd85f"), "x" : 4, "j" : 10 } { "_id" : ObjectId("4c220a42f3924d31102bd860"), "x" : 4, "j" : 11 } { "_id" : ObjectId("4c220a42f3924d31102bd861"), "x" : 4, "j" : 12 } { "_id" : ObjectId("4c220a42f3924d31102bd862"), "x" : 4, "j" : 13 } { "_id" : ObjectId("4c220a42f3924d31102bd863"), "x" : 4, "j" : 14 } { "_id" : ObjectId("4c220a42f3924d31102bd864"), "x" : 4, "j" : 15 } { "_id" : ObjectId("4c220a42f3924d31102bd865"), "x" : 4, "j" : 16 } { "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 }
-
find() 返回一个游标. 在 mongo shell中使用it操作可以遍历游标并返回更多的文档。 mongo shell将会穷尽游标并返回以下文档:
{ "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 } { "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }
想了解关于插入新文档的更多信息,参见 insert() 文档。
使用游标
当你查询一个集合时,MongoDB将返回包含查询结果的一个游标对象。然后 mongo shell遍历游标展示所有结果。shell遍历游标20次来展示最开始的20条结果,然后等待遍历剩下结果的请求,而不是一次性返回所有结果。 这可以防止 mongo 一次展示数千乃至数百万的结果。
it操作允许你在shell中遍历后面的20个结果。在之前的步骤中, 游标仅包含另外的两个文档, 所以仅显示 另外的两个文档。
本节的步骤展示使用游标的其它方式。想要更易于理解的关于游标的文档, 参见 遍历返回的游标.
使用循环遍历游标
-
在MongoDB的JavaScript shell中, 查询things 集合并将产生的游标对象赋值给变量c:
var c = db.things.find()
-
在变量c上使用while循环打印出所有的结果集:
while ( c.hasNext() ) printjson( c.next() )
如果游标有文档,hasNext() 函数返回true。next() 方法返回下一个文档。printjson()方法将文档渲染成类似 JSON的格式。
操作的结果如下, ObjectId 值唯一:
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" } { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 } { "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 } { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 } { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 } { "_id" : ObjectId("4c220a42f3924d31102bd85b"), "x" : 4, "j" : 6 } { "_id" : ObjectId("4c220a42f3924d31102bd85c"), "x" : 4, "j" : 7 } { "_id" : ObjectId("4c220a42f3924d31102bd85d"), "x" : 4, "j" : 8 } { "_id" : ObjectId("4c220a42f3924d31102bd85e"), "x" : 4, "j" : 9 } { "_id" : ObjectId("4c220a42f3924d31102bd85f"), "x" : 4, "j" : 10 } { "_id" : ObjectId("4c220a42f3924d31102bd860"), "x" : 4, "j" : 11 } { "_id" : ObjectId("4c220a42f3924d31102bd861"), "x" : 4, "j" : 12 } { "_id" : ObjectId("4c220a42f3924d31102bd862"), "x" : 4, "j" : 13 } { "_id" : ObjectId("4c220a42f3924d31102bd863"), "x" : 4, "j" : 14 } { "_id" : ObjectId("4c220a42f3924d31102bd864"), "x" : 4, "j" : 15 } { "_id" : ObjectId("4c220a42f3924d31102bd865"), "x" : 4, "j" : 16 } { "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 } { "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 } { "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }
使用游标进行数组操作
你可以把一个游标对象当做数组来操作。参考以下步骤:
1. 在 mongo shell中, 查询things 集合并将产生的游标对象赋值给变量c:
var c = db.things.find()
2. 使用以下操作找到数组中索引为4的文档:
printjson( c [ 4 ] )
MongoDB返回以下结果:
{ "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 }
当你在游标中使用数组索引符号访问, mongo 首先调用 cursor.toArray() 方法并将游标返回的所有文档加载到 RAM中。然后索引就可用于产生的数组。这个操作完全地遍历游标并穷尽这个游标。
对于非常大的结果集, mongo 可能会耗尽可用内存。
想要了解更多游标信息,参见 遍历返回的游标.
查询指定的文档
MongoDB有一个很强大的查询系统,它允许你选择和过滤一个集合中的文档以及指定的字段和值。参见查询文档和读来了解MongoDB中所有的查询。
在这个过程中, 通过传递一个“查询文档”作为参数到find() 方法中你可以查询things 集合 中指定的文档。一个查询文档指定了查询必须要匹配的条件来返回文档。
按以下步骤查询指定文档:
-
在 mongo shell中, 通过给 find() 方法传递{ name : "mongo" }这个查询文档作为参数来查询所有name字段值为mongo的文档:
db.things.find( { name : "mongo" } )
MongoDB返回符合这个条件的一个文档. ObjectId 值是不同的:
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
-
给 find()传递 { x : 4 }这个查询文档作为参数来查询所有x字段值为4的文档:
db.things.find( { x : 4 } )
MongoDB返回以下结果集:
{ "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 } { "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 } { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 } { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 } { "_id" : ObjectId("4c220a42f3924d31102bd85b"), "x" : 4, "j" : 6 } { "_id" : ObjectId("4c220a42f3924d31102bd85c"), "x" : 4, "j" : 7 } { "_id" : ObjectId("4c220a42f3924d31102bd85d"), "x" : 4, "j" : 8 } { "_id" : ObjectId("4c220a42f3924d31102bd85e"), "x" : 4, "j" : 9 } { "_id" : ObjectId("4c220a42f3924d31102bd85f"), "x" : 4, "j" : 10 } { "_id" : ObjectId("4c220a42f3924d31102bd860"), "x" : 4, "j" : 11 } { "_id" : ObjectId("4c220a42f3924d31102bd861"), "x" : 4, "j" : 12 } { "_id" : ObjectId("4c220a42f3924d31102bd862"), "x" : 4, "j" : 13 } { "_id" : ObjectId("4c220a42f3924d31102bd863"), "x" : 4, "j" : 14 } { "_id" : ObjectId("4c220a42f3924d31102bd864"), "x" : 4, "j" : 15 } { "_id" : ObjectId("4c220a42f3924d31102bd865"), "x" : 4, "j" : 16 } { "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 } { "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 } { "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }
ObjectId 值总是唯一的.
-
像前面一个查询一样查询所有x字段值为4的文档,但仅返回j的值。MongoDB也会返回 _id 字段值, 除非你显示地排除。你可以在 find()方法的第二个参数上添加 { j : 1 } 文档作为投影 。 操作类似以下这样:
db.things.find( { x : 4 } , { j : 1 } )
MongoDB 返回以下结果:
{ "_id" : ObjectId("4c220a42f3924d31102bd856"), "j" : 1 } { "_id" : ObjectId("4c220a42f3924d31102bd857"), "j" : 2 } { "_id" : ObjectId("4c220a42f3924d31102bd858"), "j" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd859"), "j" : 4 } { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "j" : 5 } { "_id" : ObjectId("4c220a42f3924d31102bd85b"), "j" : 6 } { "_id" : ObjectId("4c220a42f3924d31102bd85c"), "j" : 7 } { "_id" : ObjectId("4c220a42f3924d31102bd85d"), "j" : 8 } { "_id" : ObjectId("4c220a42f3924d31102bd85e"), "j" : 9 } { "_id" : ObjectId("4c220a42f3924d31102bd85f"), "j" : 10 } { "_id" : ObjectId("4c220a42f3924d31102bd860"), "j" : 11 } { "_id" : ObjectId("4c220a42f3924d31102bd861"), "j" : 12 } { "_id" : ObjectId("4c220a42f3924d31102bd862"), "j" : 13 } { "_id" : ObjectId("4c220a42f3924d31102bd863"), "j" : 14 } { "_id" : ObjectId("4c220a42f3924d31102bd864"), "j" : 15 } { "_id" : ObjectId("4c220a42f3924d31102bd865"), "j" : 16 } { "_id" : ObjectId("4c220a42f3924d31102bd866"), "j" : 17 } { "_id" : ObjectId("4c220a42f3924d31102bd867"), "j" : 18 } { "_id" : ObjectId("4c220a42f3924d31102bd868"), "j" : 19 } { "_id" : ObjectId("4c220a42f3924d31102bd869"), "j" : 20 }
返回集合中的单个文档
使用 db.collection.findOne() 方法你可以从MongoDB集合当中返回单个文档 。 findOne() 方法使用和 find()方法相同的参数, 但是返回一个文档而不是一个游标。
想要检索things集合中的一个文档,使用以下命令:
db.things.findOne()
限制结果集中的文档数目
通过限制你的应用程序必须通过网络获取的数据量,你可以限制结果集的数量来提升性能。
想要指定结果集中文档的最大数量,在游标上调用 limit() 方法, 如下:
db.things.find().limit(3)
MongoDB将返回下面的拥有不同ObjectId 值的结果:
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
{ "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 }
注:本文翻译自http://docs.mongodb.org/manual/tutorial/getting-started/#insert-individual-documents,敬请指正。