`
风雪涟漪
  • 浏览: 506908 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:9006
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:18384
社区版块
存档分类
最新评论

MongoDB快速指南

阅读更多

获取MongoDB数据库

请看这篇文章快速 体验MongoDB-windows版本 http://xiayuanfeng.iteye.com/blog/978729

连接数据库

这部分让我们通过MongoDB shell来操作数据库. (我们也可以使用各种语言的MongoDB的驱动.  shell是非常方便系统管理员操作的环境)

启动MongoDB Shell环境

# 'mongo' 是个可运行程序. 准确的路径地址,取决于你安装的目录。
$ bin/mongo

默认的是连接localhost上的test数据库

MongoDB shell version: <whatever>
url: test
connecting to: test
type "help" for help
>

"connecting to:" 告诉我们当前连接的数据库名称. 如果要切换数据库,输入:

> use mydb
switched to db mydb

要得知更多的命令,请输入help.

对于有其他数据库丰富经验的人员予以提示:
你可能注意到了,上述例子中,我们没有创建database或者collection,MongoDB不需要你这么做。当你插入了数据,MongoDB会自动创建database和collection。如果你查询一个不存在的collection,MongoDB会认为它是个空的collection。

使用use命令来切换database,并不会及时的创建database-当数据第一次插入到database中,MongoDB才开始创建database。也就是说如果你使用use命令切换一个不存在的database,这个database也不会出现在·show dbs· 的列表中。

向collection中插入数据

让我们创建一个测试的collection并向它插入数据. 我们将要创建两个对象, j 和t, 并且把它们保存在名称为things的collection中。

在下面的例子中, '>' 是shell的提示符。

> 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 }
>

需要注意的事项 :

  • 我们并没有提前定义好collection。MongoDB会在数据第一次插入的时候自动创建它。
  • 这个document可以存储任意的结构- 
  • 在这个例子中, 这两个document字段并不都一样,结构不同. 在实际应用中,
  • 一般来说在同一个collection中存储的documents结构都是相同的。
  • 然而,这种灵活性意味着schema迁移与扩展更为简单。 这样你就很少写那种alter table的脚本了。
  • 随着数据插入到database中, document对象都会在_id字段上赋予一个object ID(唯一值)。
  • 当你运行上面的列子object ID是不同的。

让我们添加更多的documents。

> 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

要注意的是,并不是所有的documents都显示了,当自动迭代一个游标(cursor)时候,

shell的限制数为20。除了我们已经添加的两个documents,实际我们看到的文档数为18个。

如果想要下一个结果集,输入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()返回了一个cursor对象。但是在上个例子中,我们没有把cursor赋予一个变量,
因此shell自动迭代了这个cursor。给我们显示了一个最初的结果集并且可以输入it命令来查看后续的结果集。
但是我们可以直接操作cursor;下一部分我们详细讨论。

 

通过查询语句访问数据


在我们讨论查询语句之前,让我们讨论下一个怎样处理查询结果。也就是cursor对象。
我们会使用间的find()查询方法,这个方法会返回一个collection中所有的documents,
并且之后在讲解怎样创建一个具体的查询。
当使用mongo shell的时候,为了查看一个collection中所有的玄素,
我们需要直接使用find()操作返回的cursor对象。

让我们重复相同的查询,但是唯一不同的是使用cursor并且对它进行迭代了。

 

> var cursor = db.things.find();
> while (cursor.hasNext()) 
print json(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 }

上面的例子现实了基于cursor风格的迭代过程。hasNext()方法可以得知是否还可以返回
更多的documents,并且next()方法返回了下一个的document。我们还使用了内置的
pringjson()方法来展示JSON风格的document。
当我们在javascript shell环境下,我们可以使用javascript的语言,
所以可以调用forEach来循环cursor。重复这个例子,但是使用forEach()方法来替代while循环。
> 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()方法,我们必须第一个函数,这个函数用来调用cursor中每个document。
在mongo shell中,你可以把cursor当做一个数组:

 

> var cursor = db.things.find();
> printjson(cursor[4]);
{ "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 }

当你这么使用cursor的时候,要注意的是当访问数据的同时,所有的数据都被写入
到RAM中了。这对于大数据集来说是不合适的,可能内存溢出。cursor应该用来迭代。
还要说的就是你可以把cursor转为一个真正的数组:
> var arr = db.things.find().toArray();
> arr[5];
{ "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 }
要注意的是这种数组特性只适用于mongo shell环境,其他的驱动并不支持。
MongoDB cursor并不是一个快照(snapshots)-你的操作或者其他用户的操作在
第一次和最后一次调用你的cursor的next()方法,也许并不会返回结果。请使用锁来做一个快照式的查询。

 

返回特定的查询结果


现在我们知道怎样操作查询所返回的cursor对象了,接下来我们就关注下怎样返回
特定的查询结果。一般来说,先创建一个"query document",来和已有的documents进行匹配。
这部分举例要比解释更好。在下面的例子中,我们会给出SQL查询语句,并且举例
怎样通过mongo shell来获取和SQL相同的结果。

这些都是MongoDB查询的基础,也可以查看各个语言驱动的实现。

SELECT * FROM things WHERE name="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 }

这个查询表达式本身就是个document。一个查询document的格式{a:A,b:B,...}等同于SQL中的
"where a==A and b==B and ..."。更多的查询功能查看Queries and Cursors
MongoDB  也可以返回“部分documents”。这个documents只包含了部分字段。你可以使用find()
方法的第二字参数。

为了举例,让我们重复上一个例子find({x:4})并且加上了第二个参数来加以限制,只返回j字段。

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(color: #009100; backgroun

  


  
分享到:
评论

相关推荐

    MongoDB权威指南中文版.pdf

    2. 动态模式:MongoDB支持动态模式,这意味着同一个集合中的文档不需要具有相同的字段和数据类型,十分灵活,方便快速开发。 3. 分布式存储:MongoDB支持复制和分片,易于构建分布式数据库。副本集(replica sets)...

    MongoDB权威指南 中文版

    ### MongoDB权威指南知识点总结 #### 一、MongoDB概述 - **定义与特点**:MongoDB是一种基于分布式文件存储的数据库系统,属于NoSQL数据库的一种。它将数据以BSON(Binary JSON)格式存储,这种格式类似于JSON文档...

    别再用了MongoDB权威指南 中文版

    相比于严格遵循ACID(原子性、一致性、隔离性和持久性)原则的关系型数据库,MongoDB更注重CAP(一致性、可用性和分区容错性)理论中的高可用性和分区容错性,这使得MongoDB在大数据、实时分析和快速迭代的应用中...

    MongoDB权威指南-中文版.pdf

    通过阅读《MongoDB权威指南》这本书,你可以深入了解MongoDB的原理、安装与配置、数据模型设计、备份与恢复策略、性能调优、安全性等方面的知识,从而更好地运用MongoDB来解决实际问题。无论你是初学者还是经验丰富...

    MongoDB权威指南高清中英文两版PDF

    这份"MongoDB权威指南高清中英文两版PDF"涵盖了MongoDB的基础到高级概念,是学习和掌握这一数据库系统的重要参考资料。 首先,中文版与英文版的结合使得无论对于初级还是高级用户,都能根据自己的语言习惯进行学习...

    MongoDB权威指南第2版中文版带目录

    MongoDB的数据模型非关系型,文档结构灵活,适合快速迭代的Web应用。在介绍基础操作时,会涵盖插入、更新、删除文档,以及查询数据的各种方法,包括聚合框架,用于进行复杂的数据分析和报表生成。 书中还会详细介绍...

    MongoDB权威指南

    《MongoDB权威指南》是Kristina Chodorow和Michael Dirolf共同编写的经典之作,由O'Reilly Media出版,于2010年首次发行。本书被公认为MongoDB学习与使用的宝典,深入浅出地介绍了MongoDB的各个方面,从基本概念到...

    MongoDB入门指南.pdf

    MongoDB入门指南 MongoDB是一种开源的文档类型数据库,它具有高性能、可扩展、高可用、自动收缩等特性。MongoDB能够避免传统的ORM映射,从而有助于开发。MongoDB中的每一行记录就是一个文档,它是一个由键值对构成...

    Mongo DB 权威指南(中文版)

    ### MongoDB权威指南(中文版)知识点总结 #### 一、MongoDB概述 1. **定义与特点**:MongoDB是一款开源的文档型数据库系统,它使用JSON格式的文档存储数据,支持动态模式,使得开发人员可以轻松地进行数据操作。...

    MongoDB 手册和MongoDB权威指南

    "Mongodb介绍.mht" 和 "MongoDB入门简介.mht" 是针对初学者的快速入门教程,它们通常会概述MongoDB的核心概念,如文档、集合、数据库,以及如何创建、读取、更新和删除数据(CRUD操作)。这些教程还会讲解如何安装...

    MongoDB权威指南:MongoDB:The Definitive Guide

    首先,书中会详细介绍MongoDB的安装和配置过程,无论是Windows、Linux还是macOS平台,都有详尽的步骤指导,帮助读者快速搭建开发环境。同时,还会涉及MongoDB的命令行工具,如mongo shell的使用,以及如何通过可视化...

    mongodb权威指南 pdf

    1. **MongoDB基础知识**:MongoDB以JSON格式的文档存储数据,这种模式允许快速存储和检索复杂结构的数据。书中会详细介绍MongoDB的基本概念,如数据库、集合、文档、BSON(二进制JSON)编码等。 2. **安装与配置**...

    MongoDB安装指南

    下面是 MongoDB 安装指南,旨在帮助用户快速安装和使用 MongoDB。 一、安装 MongoDB MongoDB 安装非常简单,下面是安装步骤: 1. 首先,在公共服务器(192.168.0.9)下的“w/胡云生”目录下,下载 mongodb-linux...

    MongoDB权威指南+深入MongoDB

    本文将基于“MongoDB权威指南”和“深入MongoDB”这两本书籍,详细介绍MongoDB的核心概念、功能特性以及如何进行有效的学习和实践。 1. MongoDB基础: MongoDB使用JSON-like的BSON数据格式存储数据,这种格式便于...

    深入学习MongoDB及MongoDB权威指南(第2版)

    例如,对于Web应用,MongoDB能够轻松处理JSON格式的用户数据,对于需要快速读写和高并发的场景尤为适合。同时,它的复制集功能提供了数据冗余,确保了在节点故障时服务的连续性。 学习这两本书,你将能够掌握...

    MongoDB权威指南PDF

    - **易用性**:MongoDB的安装配置简单,同时提供了多种编程语言的驱动程序,方便开发者快速上手。 综上所述,《MongoDB权威指南》不仅是一本介绍MongoDB基础知识的书籍,更是深入了解其高级特性和最佳实践的宝贵...

Global site tag (gtag.js) - Google Analytics