- Install MongoDB >
- MongoDB 快速入门
MongoDB 快速入门¶
这篇教程通过使用 mongo shell 命令行工具介绍一些基本的数据库操作。
这篇教程假设你是在Linux或者OS X上安装并运行了MongoDB数据库服务器。MongoDB同样支持Windows。 如果你想了解一些在Windows上安装运行MongoDB的信息,请参考安装文档: installation。
连接到数据库¶
在这个部分,你会连接到MongoDB数据库服务器,一个 mongod 进程实例。然后使用 mongo shell 来选择这个实例内的一个数据库并查看一些帮助信息。
连接到一个 mongod¶
在命令行提示符下,输入 mongo 命令来启动 mongo 程序
mongo
默认情况下 mongo 程序会自动尝试去连接到本机localhost的 27017 端口。 若要连接到一个不同的服务器或者不同端口,你可以使用参数 --host 。
选定一个数据库¶
mongo 程序启动时会默认选定 test 数据库。如果你希望知道当前选定的数据库,使用下述命令来打印出当前的数据库名:
db
在 mongo shell 命令行下,用下述命令列出所有数据库:
show dbs
切换到一个新的数据库 mydb:
use mydb
通过打印 db 变量来确认当前数据库是 mydb 数据库:
db
这个时候如果你输入 show dbs 命令, mydb 将不会在列表里面。MongoDB不会真的在文件系统创建一个数据库,除非你开始插入数据到那个数据库里。关于插入数据请参见 创建一个集合并插入文档。
2.4 新版功能: show databases 也会打印出数据库列表。
创建一个集合并插入文档¶
在这一章里,你会插入一些文档到一个新的 database 内名叫 testData 的新的 collection 里面。
MongoDB会在一个集合被调用的时候自动创建这个集合。你不需要在插入数据之前显式的创建一个集合。另外,因为MongoDB使用动态模式 dynamic schemas, 你同样也不需要在插入数据之前事先定义文档的结构。
从 mongo shell 命令行, 确认当前数据库是 mydb:
db
如果前一个操作 mongo 没有返回 mydb , 那么可以通过下述命令切换到 mydb 数据库:
use mydb
创建两个以 j 和 k 命名的两个文档:
j = { name : "mongo" } k = { x : 3 }
插入 j 和 k 文档到 testData 集合里面:
db.testData.insert( j ) db.testData.insert( k )
当你插入第一个文档的时候, mongod 会同时创建 mydb 数据库和 testData 集合。
验证``testData`` 集合存在:
show collections
mongo shell 会打印出当前数据库(i.e. mydb) 内的所有集合。目前只有 testData 一个集合。所有 mongod 数据库都包含一个 system.indexes 集合。
使用 find() 方法来确认 testData 集合内有文档存在
db.testData.find()
这个操作返回如下结果。 ObjectId 的值会是唯一的:
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" } { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
所有 MongoDB 文档必须有一个 _id 字段并且字段值在集合内必须是唯一的。 这些操作没有显式的指定 _id 字段,这种情况下 mongo shell会自动为之创建一个 ObjectId 作为文档 _id 字段的值
使用游标¶
当你查询一个集合( collection )的时候, MongoDB 会返回一个封装了查询结果的游标( cursor )对象。 mongo shell 会通过遍历这个游标的指针来显示结果。默认情况下, mongo shell 只会显示游标内头20条记录。如果你希望显示剩余的结果,输入 it 命令可以获得下20条记录。
这一章节介绍一些其他使用游标的方法。如果希望了解详细的文档,请参见 see 对返回的游标进行迭代。
使用循环来遍历游标¶
在执行这个操作之前,请参考 生成测试数据 文档来添加更多地数据。你可以任意命名你的数据库或者集合,但是这个操作假设你使用的是 test 数据库内的 testData 集合。
在 mongo shell下查询 testData 集合并把结果游标对象赋值给 c 变量:
var c = db.testData.find()
用 while 循环遍历 c 对象:
while ( c.hasNext() ) printjson( c.next() )
hasNext() 方法会返回 true 如果游标还有更多地文档可用。 next() 方法则返回下一个文档。printjson() 方法以JSON形式打印出文档的内容。
这个操作列出所有文档:
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be6"), "x" : 1 } { "_id" : ObjectId("51a7dc7b2cacf40b79990be7"), "x" : 2 } { "_id" : ObjectId("51a7dc7b2cacf40b79990be8"), "x" : 3 } ...
使用数组操作来访问游标¶
下述操作可以让你把游标对象作为一个数组来操作:
在 mongo shell下查询 testData 集合并把结果游标对象赋值给 c 变量:
var c = db.testData.find()
使用下述操作去得到数组内第4个文档:
printjson( c [ 4 ] )
MongoDB返回下述结果:
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bea"), "x" : 5 }
当使用数组索引方式来访问游标内的文档的时候, mongo 首先会调用 cursor.toArray() 方法把所有匹配文档调入到内存。然后再在结果数组上进行查找。这个操作会彻底遍历游标对象。
如果结果集非常大,mongo shell可能会出现内存不够问题。
更多关于游标的信息,请参考 对返回的游标进行迭代。
查询特定的文档¶
MongoDB丰富的查询语言可以让你按照特定字段及值来选择并过滤文档。 具体请参见 查询文档 和 读操作。
在这个操作里,你可以为 find() 方法指定一个查询文档(query document)参数来对 testData 集合进行查询。 一个查询文档可以被用来指定查询条件。
在 mongo shell里, 使用 { x : 18 } 这个查询文档来查询所有具有一个字段 x 并且 x 的值是18的文档:
db.testData.find( { x : 18 } )
MongoDB返回一个符合条件的文档:
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf7"), "x" : 18 }
只返回一个文档¶
使用 findOne() 方法你可以让MongoDB只返回一个文档。 findOne() 方法的参数和 find() 是一样的,不同的是它返回一个具体的文档,而不是一个游标对象。
使用下述操作从 testData 集合取得一个文档:
db.testData.findOne()
限制结果集的文档数目¶
为提高查询性能, 你可以限制一次返回结果集的大小来防止在网络上传输太多的数据。
在游标对象上调用 limit() 方法可以限制返回文档的数目:
db.testData.find().limit(3)
MongoDB 会返回下述结果:
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be6"), "x" : 1 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be7"), "x" : 2 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be8"), "x" : 3 }