Mongo官方文档翻译 (一)

最近在学习Mongo,向通过官方文档来获得第一手资料,无奈自己的英语水比较跛脚,但是总是要迈出第一步,所以现在尝试翻译在这里,如果有不好的地方,还望各位看官拍砖,废话少说,开始:


官方文档地址:http://docs.mongodb.org/manual/tutorial/getting-started/

1.连接到数据库
通过Mongo命令连接到数据库,然后可以通过mongo shell来在数据库的实例中选择一个逻辑数据库,也可以通过mongo shell获得帮助信息;


1.1.在系统提示符下(命令行),通过运行mongo命令,如下:
mongo
默认情况下,mongo命令会把连接建立在localhost接口,并监听在27017端口。如果要连接到不同的数据库
可以使用 --port和--host操作!

1.2.选择一个数据库
在启动mongl sell之后,会话会默认连接test数据库,任何时候都可以通过db命令来返回当前的数据库:
db
db命令返回当前的数据库,
1.1.1 在mongo shell界面,通过如下命令显示mongo中的所有数据库:
show dbs;
1.1.2 通过以下命令来切换到一个新建的名为mydb的数据库中:
use mydb;
1.1.3 通过db命令来确认当前的数据库为mydb,操作如下:
db;
注意:如果你依然使用show dbs命令,mongo db不会返回mydb的名称,因为MongoDB直到往当前数据库中插入数据时才会
建立该数据库,(这一点类似于Android中SQLite数据库,只有getReadableDatabase()方法调用时才会新建数据库)
注意:在2.3.1的版本中,show databases;同样会返回一个数据库列表!

1.3.显示mongo 帮助
你可以再任何时候通过如下命令来调用mongo shell得到帮助信息:
help;
此外你可以在其他方法比如一些JavaScript函数,cursor对象后面添加.help()
例如:db.help(),db.collection.help()等,他们会返回具体的帮助信息!

2.创建一个聚集并插入文档
在这里,你会将文档插入到mydb数据库中一个新建的名为things的聚集中。

MongoDB会在第一次使用数据库的时候默认创建数据库和聚集,你不必要再第一次插入数据之前进行单独的创建
数据库和聚集。此外,因为MongoDB采用动态模式(dynamic schemas),所以你不必在将文档插入到聚集之前特意指定他们的结构!
插入一个单独的文档
2.1 在命令提示符下,通过以下命令确认当前context是mydb:
db
2.2 如果在刚才的操作中mongo没有返回mydb,通过如下命令将context设置为mydb:
use mydb
2.3 通过以下的JavaScript顺序语句操作,创建两个名为j,k的文档:
j = {name : "mongo"}
k = {x : 3}
2.4 通过以下操作序列将文档j,k插入到聚集things中:
db.things.insert(j)
db.things.insert(k)
当你插入第一个文档的时候,mongod文件会创建mydb数据库和things聚集!
2.5 通过以下操作来确认things已经被创建:
show collections
在这里,mongo shell会返回当前数据库(mydb)下的聚集列表,当前只有一个名叫things的聚集。
每个mongo数据库都有会以个名为system.indexes的聚集!
2.6 通过在things聚集中进行查询操作来确定刚才插入的两条文档已经存在。如下语句所示使用find()函数:
db.things.find()

以上操作会返回如下结果,其中ObjectId是唯一的:

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

所有的MongoDB文档都会有一个唯一的_id字段值,这项操作不需要明确的指定_id字段的值,
MongoDB会自动在文档插入之前生成一个唯一的ObjectId值来填充这个_id字段!



3.通过一个For循环插入多条文档
3.1 命令提示符下,通过下面的For循环向things聚集中添加多条文档:
for(var i=1; i<= 20; i++) db.things.insert( { x : 4 , j : i } )
3.2 通过如下命令查询聚集中的文档:
db.things.find()

这里mongo shell会显示聚集中的前20条文档,每个文档的ObjectId都是唯一的:


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

3.2.1 find()函数会返回一个游标(cursor),通过在mongo shell中使用it命令来
返回更多的文档或遍历cursor。mongo shell会遍历到cursor剩余数据,并
显示如下结果:
{ "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 }
{ "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }

4.游标的使用
当你查询一个聚集的时候,mongoDB会返回包含查询结果在内的cursor对象。然后mongo shell
会遍历cursor去显示结果,mongo宁可每次显示20条结果并等待命令是否显示下面20条也不愿意
一次就显示全部结果,这样使得mongo避免了将数千条数据结果在一次显示出来的而引发的相关
问题。

it命令会遍历出cursor的后面20条记录,在上面的例子中,因为下面只有2条数据,所以it命令只返回
了2条结果!

接下来的程序会显示cursor的其他用法,更详细的文档说明参照Cursor部分!

通过循环遍历Cursor:
4.1 在MongoDB JavaScipt shell中,查询things聚集并且将返回的cursor对象复制到
变量c中:

var c = db.things.find()

4.2 通过一个While循环遍历C变量来打印所有结果:

while( c.hasNext() ) printjson( c.next() )

如果cursor中还有结果,hasNext()函数会返回true,next()函数会返回接下来的文档。
printjson()函数会讲结果以JSON格式来输出!

以上操作会返回如下结果,而且 ObjectId字段仍然是唯一的:

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

4.3 通过数组来使用cursor:

你可以小数组一样巧妙的操作一个cursor对象。仔细理解下面的操作:

4.3.1 在mongo shell中,查询things聚集并将结果复制给一个C变量:

var c = db.things.find()
4.3.2 通过如下操作得到数据下表为4的文档(记录):

printjson( c [ 4 ] )

MongoDB返回如下数据:

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

当你通过数组下标的形式访问cursor中的文档时,mongo首先会调用cursor.toArray()方法,并把cursor返回
的所有文档加载到内存中,然后下标就可以在生成的数组中使用了,这项操作会完整的
遍历整个cursor并且会将游标移动到末尾!

对于巨大的结果集,mongo可能会耗尽所有可用的内存!

4.4查询指定的文档(记录)

MongoDB有一个丰富的查询系统,允许你在一个聚集中选择和锅炉特定字段和值得文档(记录)!

在这个例子中,你可以通过向find()方法传递一个“query document)”的参数来查血指定的文档。
一个“query document” 指定了查询必须匹配返回的文档的标准!

如下操作来查询指定的文档:

1.在mongo shell中通过传递{name : "mongo" }文档对象作为参数调用find()函数来查询所有文档中
name字段值为“mongo”的文档:

db.things.find( { name : "mongo" } )

 MongoDB会返回一个符合该标准的文档,其中ObjectId是唯一的:
 
  { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
 
2. 通过传递{x : 4} 对象作为参数给find()函数来查询所有文档中x的值为4的文档:

db.things.find( { x : 4 } )

MongoDB会返回如下结果集合:
{ "_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 }

ObjectId总是唯一的(这一句好啰嗦哦)!

3.查询所有文档中x的值为4的,如刚才的查询,但是只返回j的值。MongoDB也会返回_id
字段,除非进行明确的排除。所以,你把{j:1}文档作为投影添加的find()函数的第二个
参数位置,这个操作如下:

db.things.find( { x : 4 } , { j : 1 } )

MongoDB会返回如下结果:

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

4.5 从聚集中返回单独的一条文档
通过db.collection.findOne()方法可以从MongoDB的聚集中返回一条单独的文档。
findOne()方法和find()方法使用同样的参数,但是findOne()的返回值却不是cursor!

下面的命令可以从things聚集中返回一个单独的文档:
db.things.findOne()

4.6 限制结果集中文档的数量

你可以通过你的程序必须从网络上获得的数据的数量来强行的限制结果集的大小最终以提升
性能!(原文是:You can constrain the size of the result set to increase performance by limiting the amount of data your application must receive over the network.)

为了指定文档集合的最大数量,可以再cursor上调用limit()方法,命令如下:

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

MongoDB 返回如下结果:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章