MongoDB Tutorial (MangoDB 指南)

来源:互联网 发布:网络的好处 编辑:程序博客网 时间:2024/05/18 18:45

启动 MongoDB

首先请参阅快速入门,为你的系统中安装MongoDB 数据库。

连接到数据库

现在让我们用shell 来操作数据库。(在应用程序开发中,我们可以选用相应编程语言的MongoDB数据库驱动,在编程语言中做类似的shell对数据的操作,shell 在与MongoDB交互以及管理MongoDB上是非常方便的。)

启动MongoDB 的 JavaScript Shell:

打开cmd,进入MongoDB文件夹中的Bin目录下面,用mongod.exe启动数据库。另外再打开一个cmd,进入MongoDB文件夹中的Bin目录下面用mongo.exe启动shell连接至数据库。

当shell连接至MongoDB之后后,默认情况下是连接到test数据库。然后你可以看到类似的如下信息:

MongoDB shell version:2.0.1

connecting to: test

“conneting to:“ 告诉我们shell 正在使用的数据库的名字。切换到其他数据库,使用use 命令:

> use mydb

switched to db mydb

如果use命令里提供的数据库当前并不存在,use命令并不会马上创建此数据库,相反,数据库直到有数据插入的时候才会被创建。这意味着,如果use 了一个不存在的数据库A,马上用show dbs 去查看数据库列表,我们并不能看到A这个数据库出现在数据库列表里。

更多详情,请使用help 命令查看。在下面的例子中,你也可能会注意到,我们并没有显式地创建数据库或者集合,MongoDB也不会要求我们这样做。相反,一旦我们往一个原本不存在的数据库中插入了数据,MongoDB会在底层自动地为我们创建集合和数据库(译者注:隐式创建),如果我们查询一个不存在的集合,MongoDB会认为这个集合的内容是空。

灵活的结构

MongoDB 跟传统的关系数据库非常一样。它有数据库,集合(译者注:集合相当于关系数据库的表,文档相当于记录),索引等等。数据库和集合可以被隐式创建,只要被创建,他们就会存在于MongoDB的系统目录中(db.system.collections,db.system.indexes)

集合中包含文档(译者注:相当于数据表包含记录,这里文档就相当于关系数据库的记录),文档有字段。MongoDB没有像关系数据库里那样事先定义好的字段。也就是说,文档是没有固定字段结构的。字段和字段的值类型是可以变化的。因此也就不存在类似于关系数据库中,使用altertable这样的操作去新增字段了。但是MongoDB开放这个便利方式,仅仅是为了在需要使用altertable的时候,更方便数据库的迁移及扩展,同时使基于数据库的应用开发更简单。尽管允许同一集合中的文档有不同的字段和结构,但在实际应用中还是强烈建议在一个集合中存放同类型的文档(译者注:字段结构相同的文档)。

往集合中插入数据

现在让我们创建一个测试集合同时插入一些数据。我们先创建两个对象j和t,然后将他们存入集合当中。

> j = { name : "mongo"};

{"name" : "mongo"}

> t = { x : 3 };

{ "x" : 3  }

> db.things.save(j);

> db.things.save(t);

> db.things.find();

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

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

请注意如下事实:

·        我们没有事先定义集合,数据库在插入第一条文档(j)的时候自动创建了集合。

·        两条文档有不同的字段,但是在实际应用中,集合中的文档应该都具有相同的字段结构,这里只是个演示而已。

·        插入文档的时候,文档的_id字段被自动分配了Object ID。

让我们再插入一些记录

 

> for (var i = 1; i <= 20; i++)db.things.save({x : 4, j : i});

> db.things.find();

{ "_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 }

has more

Shell 没有显示所有的记录,只显示了20条。如果我们想显示剩下的记录,我们可以用it 命令,如下:

 

{ "_id" :ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 }

{ "_id" :ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 }

has more

> it

{ "_id" :ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 }

{ "_id" :ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }

技术上说,find()返回一个指针对象,在上面的例子中我们没有将这个指针赋值给一个变量。所以shell自动地循环,输出整个集合中的所有文档。

查询数据

在我们深入讨论查询之前,让我们先看看如何使用指针。我们会使用find()方法返回的指针,并显式地将指针赋值给一个变量,代码如下:

> var cursor = db.things.find();

> while (cursor.hasNext())printjson(cursor.next());

{ "_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 }

上面的例子展示如何用指针遍历整个集合。hasNext()函数判断是否还有文档可以返回,next()方法用于返回下一个文档。我们使用printjson()方法将返回的文档以JSON的格式显示。

当我们使用javascript的shell的时候,我们也可以使用javascript语言本身的优势,简化代码,这里我们可以在指针上使用forEach方法。forEach()方法会循环整个集合,代码如下:

 

>db.things.find().forEach(printjson);

{ "_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 }

在使用forEach()方法的时候我们必须定义一个回调函数供每条文档使用(译者注:这里是内置的printjson函数)

在mongo shell 中,我们也可以将指针当做数组来处理,代码如下:

> var cursor =db.things.find();

>printjson(cursor[4]);

{ "_id" :ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 }

请注意,以上面这种以数组方式使用指针的时候,数据被装入内存(cursor[4]),对于大数据的操作,这种方式不可取,因为会占用许多内存。

出了以上以数组方式使用指针以外,我们也可以将指针转换成真正的数组,代码如下:

> var arr =db.things.find().toArray();

> arr[5];

{ "_id" :ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 }

请注意,指针上的数组特性是mongo - The Interactive Shell 提供的,并不是所有驱动都提供此特性。

MongoDB的指针也不是快照,意思是说,在指针循环整个集合期间,你或者其他用户对集合的操作(译者注:插入、更新、删除)并不能保证一定能被指针返回。

指定查询的返回结果

我们已经知道如何使用指针,现在我们看看怎样构建我们的查询来返回指定文档。

查询出来的文档集合是一组满足指定查询条件的文档集,让我们直接看看例子。在下面的例子中给出了SQL语句,以及在MongoDB中的查询方式。在下面示例中的查询方式,是所有语言的MongoDB驱动都支持的。

SELECT * FROM things WHEREname="mongo"

>db.things.find({name:"mongo"}).forEach(printjson);

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

SELECT * FROM things WHERE x=4

>db.things.find({x:4}).forEach(printjson);

{ "_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 }

示例中查询表达式查询的是文档本身。形如 {a:A, b:B, ... } 这样的表达式,它的意思翻译过来就是"where a==A andb==B and ..."。

更多查询相关的资料,请参见:Queries and Cursors 的 MongoDevelopers' Guide部分.

MongoDB也允许只返回“部分文档”,即文档的部分内容,请看如下示例,文档的x部分没有被返回:

SELECT j FROM things WHERE x=4

>db.things.find({x:4}, {j:true}).forEach(printjson);

{ "_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 }

请注意,_id文档始终都是会被返回的。

findOne()– 语法糖

为了避免操作指针全集合数据,方便起见,mongoshell 以及其他语言的驱动允许用findOne()方法只返回一条文档,findOne()方法的参数和find()完全一样,不同的是它要么只返回一条记录,要么在没有找到匹配文档的时候返回null

看如下这个例子,让我们返回name==’mongo’的文档。有许多方法可以做这个事情,可以调用指针的next()方法,也可以把指针作为数组,取数组的第一个元素。

不过findOne()是最方便和高效的一种方式,代码如下:

>printjson(db.things.findOne({name:"mongo"}));

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

说这种方式更高效是因为客户端只向数据库请求了单个对象,所以数据库和网络的负担都相对较小,与此等效的方法是find({name:"mongo"}).limit(1)。

下面这一例原理相同,只不过是通过_id查找记录罢了。

> var doc =db.things.findOne({_id:ObjectId("4c2209f9f3924d31102bd84a")});

> doc

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

限制记录返回条数

你可以使用limit()函数限制返回集合的最大条目数

使用limit()函数可以让数据库和网络不会在无用的数据上消耗资源,因此强烈建议适时使用,示例代码如下:

>db.things.find().limit(3);

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

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

{ "_id" :ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 }

更多帮助

除了使用help命令以外,如果你对某个函数做什么感兴趣,你可以在调用函数的时候不加后面的括号,shell会显示函数的源代码,比如:

> printjson

function (x) {

    print(tojson(x));

}

Mongo 是javascriptshell,所以任何javascript函数,语法,类都可以在shell中使用,另外MongoDB也定义了它自己的类,和全局变量(如db)。更多详情请参见http://api.mongodb.org/js/.


原文参见:http://www.mongodb.org/display/DOCS/Tutorial

原创粉丝点击