OPTIONS
翻译或纠错本页面

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
  1. mongo shell 命令行下,用下述命令列出所有数据库:

    show dbs
    
  2. 切换到一个新的数据库 mydb:

    use mydb
    
  3. 通过打印 db 变量来确认当前数据库是 mydb 数据库:

    db
    

    这个时候如果你输入 show dbs 命令, mydb 将不会在列表里面。MongoDB不会真的在文件系统创建一个数据库,除非你开始插入数据到那个数据库里。关于插入数据请参见 创建一个集合并插入文档

    2.4 新版功能: show databases 也会打印出数据库列表。

打印 mongo 的帮助

在任意时候你可以用下述命令得到 mongo 的帮助:

help

另外,你可以通过附加 .help() 到一些JavaScript方法,MongoDB的游标对象,以及 dbdb.collection 对象上面来获取相关的帮助信息:

创建一个集合并插入文档

在这一章里,你会插入一些文档到一个新的 database 内名叫 testData 的新的 collection 里面。

MongoDB会在一个集合被调用的时候自动创建这个集合。你不需要在插入数据之前显式的创建一个集合。另外,因为MongoDB使用动态模式 dynamic schemas, 你同样也不需要在插入数据之前事先定义文档的结构。

  1. mongo shell 命令行, 确认当前数据库是 mydb

    db
    
  2. 如果前一个操作 mongo 没有返回 mydb , 那么可以通过下述命令切换到 mydb 数据库:

    use mydb
    
  3. 创建两个以 jk 命名的两个文档:

    j = { name : "mongo" }
    k = { x : 3 }
    
  4. 插入 jk 文档到 testData 集合里面:

    db.testData.insert( j )
    db.testData.insert( k )
    

    当你插入第一个文档的时候, mongod 会同时创建 mydb 数据库和 testData 集合。

  5. 验证``testData`` 集合存在:

    show collections
    

    mongo shell 会打印出当前数据库(i.e. mydb) 内的所有集合。目前只有 testData 一个集合。所有 mongod 数据库都包含一个 system.indexes 集合。

  6. 使用 find() 方法来确认 testData 集合内有文档存在

    db.testData.find()
    

    这个操作返回如下结果。 ObjectId 的值会是唯一的:

    { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
    { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
    

    所有 MongoDB 文档必须有一个 _id 字段并且字段值在集合内必须是唯一的。 这些操作没有显式的指定 _id 字段,这种情况下 mongo shell会自动为之创建一个 ObjectId 作为文档 _id 字段的值

用For循环或者一个Javascipt方法来插入文档

在进行剩下的操作之前,首先使用文章 生成测试数据 里描述的方法来向你数据库添加更多的文档。

使用游标

当你查询一个集合( collection )的时候, MongoDB 会返回一个封装了查询结果的游标( cursor )对象。 mongo shell 会通过遍历这个游标的指针来显示结果。默认情况下, mongo shell 只会显示游标内头20条记录。如果你希望显示剩余的结果,输入 it 命令可以获得下20条记录。

这一章节介绍一些其他使用游标的方法。如果希望了解详细的文档,请参见 see 对返回的游标进行迭代

使用循环来遍历游标

在执行这个操作之前,请参考 生成测试数据 文档来添加更多地数据。你可以任意命名你的数据库或者集合,但是这个操作假设你使用的是 test 数据库内的 testData 集合。

  1. 在 mongo shell下查询 testData 集合并把结果游标对象赋值给 c 变量:

    var c = db.testData.find()
    
  2. 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 }
    ...
    

使用数组操作来访问游标

下述操作可以让你把游标对象作为一个数组来操作:

  1. 在 mongo shell下查询 testData 集合并把结果游标对象赋值给 c 变量:

    var c = db.testData.find()
    
  2. 使用下述操作去得到数组内第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()

更多关于查询文档的资料,请参见 查询文档读操作 documentation。

限制结果集的文档数目

为提高查询性能, 你可以限制一次返回结果集的大小来防止在网络上传输太多的数据。

在游标对象上调用 limit() 方法可以限制返回文档的数目:

db.testData.find().limit(3)

MongoDB 会返回下述结果:

{ "_id" : ObjectId("51a7dc7b2cacf40b79990be6"), "x" : 1 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be7"), "x" : 2 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be8"), "x" : 3 }

下一步的学习

关于更多操作数据库文档的信息,请参考以下资料: