- 浏览: 2682752 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
80后的童年2:
深入浅出MongoDB应用实战开发网盘地址:https://p ...
MongoDB入门教程 -
shliujing:
楼主在不是精通java和php的前提下,请不要妄下结论。
PHP、CakePHP哪凉快哪呆着去 -
安静听歌:
希望可以一给一点点注释
MySQL存储过程之代码块、条件控制、迭代 -
qq287767957:
PHP是全宇宙最强的语言!
PHP、CakePHP哪凉快哪呆着去 -
rryymmoK:
深入浅出MongoDB应用实战开发百度网盘下载:链接:http ...
MongoDB入门教程
最近时间不够用,翻译的有点慢。特别是后面的 开发指南 部分,工作量很大啊。有兴趣的盆友可以直接给我发email说明想翻译或整理的文档链接,或者直接看 这里 给roger同学发email申请wiki帐号。
获取数据库
首先通过 快速上手 让数据库跑起来。
连接数据库
现在我们通过数据库的 shell 来实际操作一下。(注意:任何编程语言都可以通过合适的 驱动 进行类似的操作,只不过shell的方式更方便交互操作和管理。)
运行MongoDB JavaScript shell:
默认情况下shell将连接本机(localhost)的“test”数据库。你将看到:
“connecting to:” 表明shell连接的数据库名。执行以下命令切换数据库:
输入 help 可以看到一个简单的命令列表。
给有其他数据库经验的开发者的提示
在下面的例子中你可能会注意到,我们没有创建数据库和聚集。MongoDB并不用那么做。一旦你插入数据,MongoDB会建立对应的聚集和数据库。要是查询了不存在的聚集,Mongo就将其视为空的聚集。
使用 use 命令来切换数据库不会立即创建数据库 - 数据库会在首次插入数据时延迟创建。这意味着如果首次 use 一个数据库,该数据库不会在 show dbs 命令的列表里显示出来,直到插入数据。
向聚集中插入数据
让我们创建一个测试聚集,然后插入一些数据。我们将会新建两个对象 j 和 t , 然后将其存放在 things 聚集中。
下面的例子中,'>' 表示在shell命令提示符输入的命令。
注意几点:
下面再往聚集里面添加一些记录:
注意这里并没有列出所有的文档 - shell 会默认显示20个。先前已经有两个文档在聚集里面了,所以这里只能看见新插入的前18个文档。
要是想接着看结果,可以用 it 命令。接着上面的例子往下:
通常,find()会返回一个游标对象,但是在上面那个例子中,我们并没有将游标赋值给一个变量。所以shell自动的移动游标,并且把初始化后的结果返回给我们,同时允许我们通过 it 命令继续移动游标。
但是我们仍然可以直接使用游标,在下一部分中将讨论如何这样做。
使用查询访问数据
在我们对查询进行深入讨论之前,我们先来看看如何通过一个游标对象操作查询结果。我们将使用简单的find()查询函数,它会返回一个聚集中的所有数据。随后我们看看如何创建一些特定的查询。
在使用 mongo shell 的时候,为了查看所有聚集中的数据元素,我们需要显式的使用从find()操作返回的游标。
让我们使用相同的查询,但是这次我们使用find()返回的游标,并且在while循环中移动游标:
上述例子展示了游标的循环方式,hasNext()函数告知是否还有文档返回,而next()函数则返回下一个文档对象。同时我们还使用了内嵌的tojson()函数来把document的对象显示成JSON数据格式。
当使用JavaScript shell 时,我们还可以享用其语言本身的函数式特性:可以对游标调用 forEach 。还拿上面的例子来说,直接在游标处将使用 forEach() 来代替while循环:
在{{forEach()}}里必须定义一个函数来对游标中的每个文档进行操作。
在 mongo shell 中,也可以把游标当作数组处理:
当这样使用游标时,注意这会将最大访问数据(上面的例子中的cursor[4])以下的所有数据都同时加载到内存中。这对大结果集非常不合适,会导致内存不够用的。当返回结果数量很大时,游标应该作为迭代器使用。
除了用数组的风格来操作游标,也可以干脆将游标转换程真正的数组:
请注意这种数组特性是[Mongo交互Shell]特有的,但并不是所有的驱动都支持。
MongoDB游标并不做快照。如果在第一次到最后一次调用 next 之间,你或别人对数据进行了修改,那么修改可能被返回,也可能不返回。要是想做快照查询的话得使用显式锁。
定制查询结果
现在我们知道了如何使用查询返回的游标对象,下面看看如何通过修改查询来定制结果。
通常,可以通过创建一种键值相匹配的“查询文档”来实现定制查询。
这些用实例更能说明问题。在下面的例子里,我们将给出SQL查询示例,并在MongDB的 mongo shell 中展示相同的查询。这种指定的查询对于MongoDB来说是基本方式,而且你也会在任何驱动和语言环境中找到类似的通用功能。
查询表达式本身就是一个文档对象,如果是一个类似于{a:A, b:B, ...}的文档查询对象,则表示”where a==A and b==B and ...”。更多关于查询的用法参考 Mongo开发者指南 的 查询与游标 章节。
MongoDB也允许返回”部分文档”,也就是返回一个数据库文档的元素子集。您只要通过使用find()函数的第二个参数就可以做到这一点。
例如,我们在上面 find({x:4}) 的例子中,加一个参数来限制只返回j域的数据:
需要注意的是"_id"域是每次都要被返回的。
findOne() - 语法糖
为了方便起见,mongo shell(和其他驱动)能避免让你用编程来处理游标,你只需要通过findOne()函数就能获得一个文档。findOne()和find()使用相同的参数,但是它不返回游标,而是从数据库中返回第一个文档,或者没有匹配条目时返回 null。
例如,我们可以通过很多种方式检索一个 name=='mongo' 的文档,包括在游标中调用next()函数(当然,要验证完是否为 null 之后),或者把游标看做一个数组然后访问数组下标为0的元素。
但是,findOne()函数是既方便又高效的:
由于只从数据库返回一个对象,这种方式更加高效,而且在数据库和网络传输上做的工作更少。这种方式等价于find({name:"mongo"}).limit(1)。
使用 limit() 限制结果集
通过 limit() 方法可以指定返回结果的最大数量,这样就能控制查询结果的大小了。
强力推荐这种使用方式,它可以大大提高性能,因为这样减少了数据库的工作量,也减少了网络中的数据流量。举个例子:
更多帮助
除了常用的 "help" 命令外,你还可以对 db 或者 db.whatever 调用 help 命令来查看可用方法概要。
如果你对某个方法做的事情好奇,你可以在输入时不带 (),然后shell会打印出该方法的源代码,例如:
mongo是一个完备的JavaScript shell,所以任何JavaScript方法,语法或类都可以在shell中使用。除此以外,MongoDB还定义一些自己的类和全局变量(如 db)。你可以查看完整的API文档 http://api.mongodb.org/js/。
下一步
在阅读完该教程之后,下一步可以深入 指南 进一步学习。
参考 SQL到Mongo映射图
注:去官方wiki看文档格式更好些 http://www.mongodb.org/display/DOCSCN/%E6%95%99%E7%A8%8B 。
获取数据库
首先通过 快速上手 让数据库跑起来。
连接数据库
现在我们通过数据库的 shell 来实际操作一下。(注意:任何编程语言都可以通过合适的 驱动 进行类似的操作,只不过shell的方式更方便交互操作和管理。)
运行MongoDB JavaScript shell:
# 'mongo' 是shell执行文件。解压目录可能因安装方法和平台而不同。 $ bin/mongo
默认情况下shell将连接本机(localhost)的“test”数据库。你将看到:
MongoDB shell version: 1.6.5 connecting to: test >
“connecting to:” 表明shell连接的数据库名。执行以下命令切换数据库:
> use mydb switched to db mydb
输入 help 可以看到一个简单的命令列表。
引用
给有其他数据库经验的开发者的提示
在下面的例子中你可能会注意到,我们没有创建数据库和聚集。MongoDB并不用那么做。一旦你插入数据,MongoDB会建立对应的聚集和数据库。要是查询了不存在的聚集,Mongo就将其视为空的聚集。
使用 use 命令来切换数据库不会立即创建数据库 - 数据库会在首次插入数据时延迟创建。这意味着如果首次 use 一个数据库,该数据库不会在 show dbs 命令的列表里显示出来,直到插入数据。
向聚集中插入数据
让我们创建一个测试聚集,然后插入一些数据。我们将会新建两个对象 j 和 t , 然后将其存放在 things 聚集中。
下面的例子中,'>' 表示在shell命令提示符输入的命令。
> j = { name : "mongo" }; { "name" : "mongo" } > t = { x : 3 }; { "x" : 3 } > db.things.save(j); > db.things.save(t); > db.things.find(); { "_id" : ObjectId("4d0d9727e34d147e5f68c486"), "name" : "mongo" } { "_id" : ObjectId("4d0d9738e34d147e5f68c487"), "x" : 3 } >
注意几点:
- 我们并没有预先定义聚集。数据库会在第一次插入操作时自动创建集。
- 我们存储的文档可以拥有任意不同的“结构”。事实上在本例中,文档之间根本没有共同的数据元素。在实际应用中文档通常都以相同的结构保存在聚集里面。这种灵活意味着迁移或者扩展都非常容易。几乎不需要写脚本来执行诸如“alter table”之类的操作。
- 一旦被插入数据库,对象就被分配一个 object ID(要是还没有的话)存储在 _id 域中
- 你运行上面的例子时,你的ObjectID的值会有所不同。
下面再往聚集里面添加一些记录:
> for (var i = 1; i <= 20; i++) db.things.save({x : 4, j : i}); > db.things.find(); { "_id" : ObjectId("4d0d9727e34d147e5f68c486"), "name" : "mongo" } { "_id" : ObjectId("4d0d9738e34d147e5f68c487"), "x" : 3 } { "_id" : ObjectId("4d0d99ace34d147e5f68c488"), "x" : 4, "j" : 1 } { "_id" : ObjectId("4d0d99ace34d147e5f68c489"), "x" : 4, "j" : 2 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48a"), "x" : 4, "j" : 3 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48b"), "x" : 4, "j" : 4 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48c"), "x" : 4, "j" : 5 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48d"), "x" : 4, "j" : 6 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48e"), "x" : 4, "j" : 7 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48f"), "x" : 4, "j" : 8 } { "_id" : ObjectId("4d0d99ace34d147e5f68c490"), "x" : 4, "j" : 9 } { "_id" : ObjectId("4d0d99ace34d147e5f68c491"), "x" : 4, "j" : 10 } { "_id" : ObjectId("4d0d99ace34d147e5f68c492"), "x" : 4, "j" : 11 } { "_id" : ObjectId("4d0d99ace34d147e5f68c493"), "x" : 4, "j" : 12 } { "_id" : ObjectId("4d0d99ace34d147e5f68c494"), "x" : 4, "j" : 13 } { "_id" : ObjectId("4d0d99ace34d147e5f68c495"), "x" : 4, "j" : 14 } { "_id" : ObjectId("4d0d99ace34d147e5f68c496"), "x" : 4, "j" : 15 } { "_id" : ObjectId("4d0d99ace34d147e5f68c497"), "x" : 4, "j" : 16 } { "_id" : ObjectId("4d0d99ace34d147e5f68c498"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4d0d99ace34d147e5f68c499"), "x" : 4, "j" : 18 } has more
注意这里并没有列出所有的文档 - shell 会默认显示20个。先前已经有两个文档在聚集里面了,所以这里只能看见新插入的前18个文档。
要是想接着看结果,可以用 it 命令。接着上面的例子往下:
{ "_id" : ObjectId("4d0d99ace34d147e5f68c498"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4d0d99ace34d147e5f68c499"), "x" : 4, "j" : 18 } has more > it { "_id" : ObjectId("4d0d99ace34d147e5f68c49a"), "x" : 4, "j" : 19 } { "_id" : ObjectId("4d0d99ace34d147e5f68c49b"), "x" : 4, "j" : 20 }
通常,find()会返回一个游标对象,但是在上面那个例子中,我们并没有将游标赋值给一个变量。所以shell自动的移动游标,并且把初始化后的结果返回给我们,同时允许我们通过 it 命令继续移动游标。
但是我们仍然可以直接使用游标,在下一部分中将讨论如何这样做。
使用查询访问数据
在我们对查询进行深入讨论之前,我们先来看看如何通过一个游标对象操作查询结果。我们将使用简单的find()查询函数,它会返回一个聚集中的所有数据。随后我们看看如何创建一些特定的查询。
在使用 mongo shell 的时候,为了查看所有聚集中的数据元素,我们需要显式的使用从find()操作返回的游标。
让我们使用相同的查询,但是这次我们使用find()返回的游标,并且在while循环中移动游标:
> var cursor = db.things.find(); > while (cursor.hasNext()) printjson(cursor.next()); { "_id" : ObjectId("4d0d9727e34d147e5f68c486"), "name" : "mongo" } { "_id" : ObjectId("4d0d9738e34d147e5f68c487"), "x" : 3 } { "_id" : ObjectId("4d0d99ace34d147e5f68c488"), "x" : 4, "j" : 1 } { "_id" : ObjectId("4d0d99ace34d147e5f68c489"), "x" : 4, "j" : 2 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48a"), "x" : 4, "j" : 3 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48b"), "x" : 4, "j" : 4 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48c"), "x" : 4, "j" : 5 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48d"), "x" : 4, "j" : 6 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48e"), "x" : 4, "j" : 7 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48f"), "x" : 4, "j" : 8 } { "_id" : ObjectId("4d0d99ace34d147e5f68c490"), "x" : 4, "j" : 9 } { "_id" : ObjectId("4d0d99ace34d147e5f68c491"), "x" : 4, "j" : 10 } { "_id" : ObjectId("4d0d99ace34d147e5f68c492"), "x" : 4, "j" : 11 } { "_id" : ObjectId("4d0d99ace34d147e5f68c493"), "x" : 4, "j" : 12 } { "_id" : ObjectId("4d0d99ace34d147e5f68c494"), "x" : 4, "j" : 13 } { "_id" : ObjectId("4d0d99ace34d147e5f68c495"), "x" : 4, "j" : 14 } { "_id" : ObjectId("4d0d99ace34d147e5f68c496"), "x" : 4, "j" : 15 } { "_id" : ObjectId("4d0d99ace34d147e5f68c497"), "x" : 4, "j" : 16 } { "_id" : ObjectId("4d0d99ace34d147e5f68c498"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4d0d99ace34d147e5f68c499"), "x" : 4, "j" : 18 } { "_id" : ObjectId("4d0d99ace34d147e5f68c49a"), "x" : 4, "j" : 19 } { "_id" : ObjectId("4d0d99ace34d147e5f68c49b"), "x" : 4, "j" : 20 }
上述例子展示了游标的循环方式,hasNext()函数告知是否还有文档返回,而next()函数则返回下一个文档对象。同时我们还使用了内嵌的tojson()函数来把document的对象显示成JSON数据格式。
当使用JavaScript shell 时,我们还可以享用其语言本身的函数式特性:可以对游标调用 forEach 。还拿上面的例子来说,直接在游标处将使用 forEach() 来代替while循环:
> db.things.find().forEach(printjson); { "_id" : ObjectId("4d0d9727e34d147e5f68c486"), "name" : "mongo" } { "_id" : ObjectId("4d0d9738e34d147e5f68c487"), "x" : 3 } { "_id" : ObjectId("4d0d99ace34d147e5f68c488"), "x" : 4, "j" : 1 } { "_id" : ObjectId("4d0d99ace34d147e5f68c489"), "x" : 4, "j" : 2 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48a"), "x" : 4, "j" : 3 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48b"), "x" : 4, "j" : 4 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48c"), "x" : 4, "j" : 5 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48d"), "x" : 4, "j" : 6 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48e"), "x" : 4, "j" : 7 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48f"), "x" : 4, "j" : 8 } { "_id" : ObjectId("4d0d99ace34d147e5f68c490"), "x" : 4, "j" : 9 } { "_id" : ObjectId("4d0d99ace34d147e5f68c491"), "x" : 4, "j" : 10 } { "_id" : ObjectId("4d0d99ace34d147e5f68c492"), "x" : 4, "j" : 11 } { "_id" : ObjectId("4d0d99ace34d147e5f68c493"), "x" : 4, "j" : 12 } { "_id" : ObjectId("4d0d99ace34d147e5f68c494"), "x" : 4, "j" : 13 } { "_id" : ObjectId("4d0d99ace34d147e5f68c495"), "x" : 4, "j" : 14 } { "_id" : ObjectId("4d0d99ace34d147e5f68c496"), "x" : 4, "j" : 15 } { "_id" : ObjectId("4d0d99ace34d147e5f68c497"), "x" : 4, "j" : 16 } { "_id" : ObjectId("4d0d99ace34d147e5f68c498"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4d0d99ace34d147e5f68c499"), "x" : 4, "j" : 18 } { "_id" : ObjectId("4d0d99ace34d147e5f68c49a"), "x" : 4, "j" : 19 } { "_id" : ObjectId("4d0d99ace34d147e5f68c49b"), "x" : 4, "j" : 20 }
在{{forEach()}}里必须定义一个函数来对游标中的每个文档进行操作。
在 mongo shell 中,也可以把游标当作数组处理:
> var cursor = db.things.find(); > printjson(cursor[4]); { "_id" : ObjectId("4d0d99ace34d147e5f68c48a"), "x" : 4, "j" : 3 }
当这样使用游标时,注意这会将最大访问数据(上面的例子中的cursor[4])以下的所有数据都同时加载到内存中。这对大结果集非常不合适,会导致内存不够用的。当返回结果数量很大时,游标应该作为迭代器使用。
除了用数组的风格来操作游标,也可以干脆将游标转换程真正的数组:
> var arr = db.things.find().toArray(); > arr[5]; { "_id" : ObjectId("4d0d99ace34d147e5f68c48b"), "x" : 4, "j" : 4 }
请注意这种数组特性是[Mongo交互Shell]特有的,但并不是所有的驱动都支持。
MongoDB游标并不做快照。如果在第一次到最后一次调用 next 之间,你或别人对数据进行了修改,那么修改可能被返回,也可能不返回。要是想做快照查询的话得使用显式锁。
定制查询结果
现在我们知道了如何使用查询返回的游标对象,下面看看如何通过修改查询来定制结果。
通常,可以通过创建一种键值相匹配的“查询文档”来实现定制查询。
这些用实例更能说明问题。在下面的例子里,我们将给出SQL查询示例,并在MongDB的 mongo shell 中展示相同的查询。这种指定的查询对于MongoDB来说是基本方式,而且你也会在任何驱动和语言环境中找到类似的通用功能。
SELECT * FROM things WHERE name="mongo" > db.things.find({name:"mongo"}).forEach(function(x) {print(tojson(x));}); { "_id" : ObjectId("4d0d9727e34d147e5f68c486"), "name" : "mongo" } SELECT * FROM things WHERE x=4 > db.things.find({x:4}).forEach(function(x) {print(tojson(x));}); { "_id" : ObjectId("4d0d99ace34d147e5f68c488"), "x" : 4, "j" : 1 } { "_id" : ObjectId("4d0d99ace34d147e5f68c489"), "x" : 4, "j" : 2 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48a"), "x" : 4, "j" : 3 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48b"), "x" : 4, "j" : 4 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48c"), "x" : 4, "j" : 5 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48d"), "x" : 4, "j" : 6 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48e"), "x" : 4, "j" : 7 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48f"), "x" : 4, "j" : 8 } { "_id" : ObjectId("4d0d99ace34d147e5f68c490"), "x" : 4, "j" : 9 } { "_id" : ObjectId("4d0d99ace34d147e5f68c491"), "x" : 4, "j" : 10 } { "_id" : ObjectId("4d0d99ace34d147e5f68c492"), "x" : 4, "j" : 11 } { "_id" : ObjectId("4d0d99ace34d147e5f68c493"), "x" : 4, "j" : 12 } { "_id" : ObjectId("4d0d99ace34d147e5f68c494"), "x" : 4, "j" : 13 } { "_id" : ObjectId("4d0d99ace34d147e5f68c495"), "x" : 4, "j" : 14 } { "_id" : ObjectId("4d0d99ace34d147e5f68c496"), "x" : 4, "j" : 15 } { "_id" : ObjectId("4d0d99ace34d147e5f68c497"), "x" : 4, "j" : 16 } { "_id" : ObjectId("4d0d99ace34d147e5f68c498"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4d0d99ace34d147e5f68c499"), "x" : 4, "j" : 18 } { "_id" : ObjectId("4d0d99ace34d147e5f68c49a"), "x" : 4, "j" : 19 } { "_id" : ObjectId("4d0d99ace34d147e5f68c49b"), "x" : 4, "j" : 20 }
查询表达式本身就是一个文档对象,如果是一个类似于{a:A, b:B, ...}的文档查询对象,则表示”where a==A and b==B and ...”。更多关于查询的用法参考 Mongo开发者指南 的 查询与游标 章节。
MongoDB也允许返回”部分文档”,也就是返回一个数据库文档的元素子集。您只要通过使用find()函数的第二个参数就可以做到这一点。
例如,我们在上面 find({x:4}) 的例子中,加一个参数来限制只返回j域的数据:
SELECT j FROM things WHERE x=4 > db.things.find({x:4}, {j:true}).forEach(printjson); { "_id" : ObjectId("4d0d99ace34d147e5f68c488"), "j" : 1 } { "_id" : ObjectId("4d0d99ace34d147e5f68c489"), "j" : 2 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48a"), "j" : 3 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48b"), "j" : 4 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48c"), "j" : 5 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48d"), "j" : 6 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48e"), "j" : 7 } { "_id" : ObjectId("4d0d99ace34d147e5f68c48f"), "j" : 8 } { "_id" : ObjectId("4d0d99ace34d147e5f68c490"), "j" : 9 } { "_id" : ObjectId("4d0d99ace34d147e5f68c491"), "j" : 10 } { "_id" : ObjectId("4d0d99ace34d147e5f68c492"), "j" : 11 } { "_id" : ObjectId("4d0d99ace34d147e5f68c493"), "j" : 12 } { "_id" : ObjectId("4d0d99ace34d147e5f68c494"), "j" : 13 } { "_id" : ObjectId("4d0d99ace34d147e5f68c495"), "j" : 14 } { "_id" : ObjectId("4d0d99ace34d147e5f68c496"), "j" : 15 } { "_id" : ObjectId("4d0d99ace34d147e5f68c497"), "j" : 16 } { "_id" : ObjectId("4d0d99ace34d147e5f68c498"), "j" : 17 } { "_id" : ObjectId("4d0d99ace34d147e5f68c499"), "j" : 18 } { "_id" : ObjectId("4d0d99ace34d147e5f68c49a"), "j" : 19 } { "_id" : ObjectId("4d0d99ace34d147e5f68c49b"), "j" : 20 }
需要注意的是"_id"域是每次都要被返回的。
findOne() - 语法糖
为了方便起见,mongo shell(和其他驱动)能避免让你用编程来处理游标,你只需要通过findOne()函数就能获得一个文档。findOne()和find()使用相同的参数,但是它不返回游标,而是从数据库中返回第一个文档,或者没有匹配条目时返回 null。
例如,我们可以通过很多种方式检索一个 name=='mongo' 的文档,包括在游标中调用next()函数(当然,要验证完是否为 null 之后),或者把游标看做一个数组然后访问数组下标为0的元素。
但是,findOne()函数是既方便又高效的:
> printjson(db.things.findOne({name:"mongo"})); { "_id" : ObjectId("4d0d9727e34d147e5f68c486"), "name" : "mongo" }
由于只从数据库返回一个对象,这种方式更加高效,而且在数据库和网络传输上做的工作更少。这种方式等价于find({name:"mongo"}).limit(1)。
使用 limit() 限制结果集
通过 limit() 方法可以指定返回结果的最大数量,这样就能控制查询结果的大小了。
强力推荐这种使用方式,它可以大大提高性能,因为这样减少了数据库的工作量,也减少了网络中的数据流量。举个例子:
> db.things.find().limit(3); { "_id" : ObjectId("4d0d9727e34d147e5f68c486"), "name" : "mongo" } { "_id" : ObjectId("4d0d9738e34d147e5f68c487"), "x" : 3 } { "_id" : ObjectId("4d0d99ace34d147e5f68c488"), "x" : 4, "j" : 1 }
更多帮助
除了常用的 "help" 命令外,你还可以对 db 或者 db.whatever 调用 help 命令来查看可用方法概要。
如果你对某个方法做的事情好奇,你可以在输入时不带 (),然后shell会打印出该方法的源代码,例如:
> printjson function (x) { print(tojson(x)); }
mongo是一个完备的JavaScript shell,所以任何JavaScript方法,语法或类都可以在shell中使用。除此以外,MongoDB还定义一些自己的类和全局变量(如 db)。你可以查看完整的API文档 http://api.mongodb.org/js/。
下一步
在阅读完该教程之后,下一步可以深入 指南 进一步学习。
参考 SQL到Mongo映射图
注:去官方wiki看文档格式更好些 http://www.mongodb.org/display/DOCSCN/%E6%95%99%E7%A8%8B 。
评论
4 楼
80后的童年2
2018-01-16
深入浅出MongoDB应用实战开发
网盘地址:https://pan.baidu.com/s/1htDkvlU 密码: 8ue7
网盘地址:https://pan.baidu.com/s/1jJwlsdK 密码: sgzg
网盘地址:http://pan.baidu.com/s/1pL5v2hP 密码: qmq9
网盘地址:https://pan.baidu.com/s/1htDkvlU 密码: 8ue7
网盘地址:https://pan.baidu.com/s/1jJwlsdK 密码: sgzg
网盘地址:http://pan.baidu.com/s/1pL5v2hP 密码: qmq9
3 楼
rryymmoK
2015-09-14
深入浅出MongoDB应用实战开发
百度网盘下载:链接:http://pan.baidu.com/s/1dDhQVjb 密码:zdqg
百度网盘下载:链接:http://pan.baidu.com/s/1dDhQVjb 密码:zdqg
2 楼
我不认输
2014-11-06
课程目录:
01-mongodb文档型数据库特点介绍
02-mongodb安装过程
03-mongo库表操作语句
04-CURD操作详解
05-深入查询表达式
06-游标操作
07-索引
08-用户管理
09-mongoDB备份与恢复
10-replication复制集
11-shard分片
12-手动预先分片
13-replcation与shard分片结合使用
14-PHP-Mongo扩展编译及使用
15-短网址项目之网址算法
16-短网址项目之添加网址
17-短网址项目之完成项目
18-聚集运算之group
19-aggregate聚集框架
20-mapReduce概念及用法
21-mapReduce实战地震数据分析
课程笔记+资料
网盘地址:http://pan.baidu.com/s/10Gk9K 密码: rydr
01-mongodb文档型数据库特点介绍
02-mongodb安装过程
03-mongo库表操作语句
04-CURD操作详解
05-深入查询表达式
06-游标操作
07-索引
08-用户管理
09-mongoDB备份与恢复
10-replication复制集
11-shard分片
12-手动预先分片
13-replcation与shard分片结合使用
14-PHP-Mongo扩展编译及使用
15-短网址项目之网址算法
16-短网址项目之添加网址
17-短网址项目之完成项目
18-聚集运算之group
19-aggregate聚集框架
20-mapReduce概念及用法
21-mapReduce实战地震数据分析
课程笔记+资料
网盘地址:http://pan.baidu.com/s/10Gk9K 密码: rydr
1 楼
SpreadDiaries
2011-03-05
相关推荐
本基础教程将带你了解MongoDB的核心概念和基本操作,包括安装、数据模型、 CRUD操作、索引、复制集以及Java驱动的使用。 首先,MongoDB的基础知识包括其NoSQL的数据模型。不同于传统的关系型数据库,MongoDB使用...
MongoDB 入门教程笔记
mongoDB 的基础教程,mongoDB的数据库创建删除,以及集合的增删改查,索引等
首先,我们从"MongoDB入门教程"开始。MongoDB采用的是键值对存储方式,数据以JSON格式(BSON)存储,这使得数据的读写更加自然和高效。MongoDB支持丰富的查询语法,包括字段选择、条件操作、排序和分组,为开发者...
MongoDB 的入门教程旨在帮助初学者快速掌握这个数据库系统的基本概念和操作。 《MongoDB 入门教程》CHM 手册可能涵盖以下关键知识点: 1. **数据模型**:MongoDB 使用类似 JSON 的文档结构(BSON)来存储数据,...
教程名称:MongoDB教程基础入门 课程目录:【】MongoDB教程基础入门-代码【】MongoDB教程基础入门01第一讲上【】MongoDB教程基础入门02第一讲下【】MongoDB教程基础入门03第二讲上【】MongoDB教程基础入门04第二讲...
"Mongodb入门教程、示例+Spring Boot完整示例+聚合" 本节课将完整地介绍 MongoDB 的入门教程、示例、Spring Boot 完整示例和聚合。 简介 NoSQL(Not Only SQL)是一种非关系型的数据库, MongoDB 是基于分布式...
1.mongodb-win32-i386-2.4.8.zip 由于大小限制,请到官网下载...2.MongoDB开发使用手册.docx 3.MongoDB快速入门教程.docx 4.MongoDB入门经典.doc 5.MougoTest.rar(MongoDB入门经典.doc用例)
### MongoDB基础教程知识点详解 #### 一、MongoDB概述 MongoDB是一款非常流行的NoSQL数据库系统,它以其灵活的数据模型和高性能的特点而受到广大开发者的青睐。尤其在处理大规模的非结构化数据方面表现突出,这...
### MongoDB基础教程知识点详解 #### 一、MongoDB概述 MongoDB是一款开源的NoSQL(非关系型)数据库,以其灵活的数据模型、高扩展性和高性能而受到广泛欢迎。它使用BSON(Binary JSON)格式存储数据,这使得数据...
MongoDB是一个分布式文件存储的数据库,由C++语言编写,专门针对Web应用提供高性能的数据存储解决方案。作为非关系型数据库(NoSQL)的一种,MongoDB结合了关系数据库和非关系数据库的优点,尤其适合处理大量复杂、...
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB[2]是一个介于关系数据库...教程官网:http://www.w3cschool.cc/mongodb/mongodb-tutorial.html
MongoDB入门指南 MongoDB是一种开源的文档类型数据库,它具有高性能、可扩展、高可用、自动收缩等特性。MongoDB能够避免传统的ORM映射,从而有助于开发。MongoDB中的每一行记录就是一个文档,它是一个由键值对构成...
MongoDB练习文件