一、连接数据库
首先ps -ef|grep mongod确认mongod已经运行了,然后使用mongo shell来选择数据库实例中的一个逻辑数据库。并且在mongo shell中访问help来查看相关指令。
1、连接mongod
#mongo
执行如上命令能启动mongo,并出现提示符:
缺省情况下,mongo会寻找并连接到数据库服务器监听的端口locahost:27017。如果要连接指定的IP和端口,可以使用--port和--host选项:
#mongo --port 27017 --host 192.168.10.131
MongoDB shell version: 2.4.2
connecting to: 192.168.10.131:27017/test
从上面可以看出默认
MongoDB版本为2.4.2,连接的IP和端口号,以及默认数据库test。
2、选择数据库
执行如下命令会显示当前数据库:
> db
test
执行如下命令会显示所有数据库:
> show dbs
admin (empty)
local 0.078125GB
test 0.203125GB
执行如下命令切换到已经存在的数据库:
> use local
switched to db local
再次执行db命令,确认切换成功了。
执行如下命令切换到名字为mydb的新数据库:
> use mydb
switched to db mydb
执行db命令依然可以确认切换成功了,但是执行show dbs命令却看不到mydb,这是因为MongoDB不会创建一个新的数据库直到插入数据到新数据库中,插入数据后文书会介绍。
2.4版本中执行show databases命令也能返回一个数据库列表。
3、help信息
执行help命令能显示帮助信息:
> help
db.help() help on db methods
db.mycoll.help() help on collection methods
sh.help() sharding helpers
rs.help() replica set helpers
help admin administrative help
help connect connecting to a db help
help keys key shortcuts
help misc misc things to know
help mr mapreduce
show dbs show database names
show collections show collections in current database
show users show users in current database
show profile show most recent system.profile entries with time >= 1ms
show logs show the accessible logger names
show log [name] prints out the last segment of log in memory, 'global' is default
use
set current database
db.foo.find() list objects in collection foo
db.foo.find( { a : 1 } ) list objects in foo where a == 1
it result of the last line evaluated; use to further iterate
DBQuery.shellBatchSize = x set default number of items to display on shell
exit quit the mongo shell
此外,通过.help()方法能够追加一些附加的帮助信息到help中。
二、创建集合和插入文档
本节介绍如何插入文档到命名为things的集合中,该集合在前面创建的数据库mydb中。MongoDB在第一次使用时隐式创建集合和数据库,即你不需要在插入数据前创建数据库或者集合。此外,因为MongoDB使用,所以你不需要在插入数据到集合前指定文档的结构。
1、插入单个文档
(1)在mongo shell中执行db命令,确认当前数据库为mydb。
(2)如果当前数据库不是mydb,则执行use mydb命令切换mydb为当前数据库。
(3)用下面的JavaScript操作序列(mongo其实也是一个js编译器)创建2个文档,分别命令为j和k:
j = { name : "mongo" }
k = { x : 3 }
(4)用如下操作序列来插入文档j和k到集合things中:
db.things.insert(j)
db.things.insert(k)
当插入第一个文档时,mongod会同时创建好数据库mydb和集合things。
(5)通过如下操作来确认集合things已经存在了:
show collections
(6)通过在集合things上执行查询来确认文档已经存在了,使用find()方法如下面一样即可:
db.things.find()
这个操作返回结果如下:
{ "_id" : ObjectId("51776f984633b0bb4464c8df"), "name" : "mongo" }
{ "_id" : ObjectId("51776f9c4633b0bb4464c8e0"), "x" : 3 }
其中,值是唯一的。所有的MongoDB文档必须有一个值唯一的_id域。这些操作不会为_id域显示指定一个值,因此,在插入文档到集合前,mongo为这个域创建一个唯一的ObjectId值。
2、插入多个文档
(1)用如下循环能插入多个文档到集合things中:
for (var i = 1; i <= 20; i++) db.things.insert({x : 4, j : i})
(2)执行db.things.find()查询集合中的文档,返回集合中的20个文档,其ObjectId值都不一样:
{ "_id" : ObjectId("51776f984633b0bb4464c8df"), "name" : "mongo" }
{ "_id" : ObjectId("51776f9c4633b0bb4464c8e0"), "x" : 3 }
{ "_id" : ObjectId("517773144633b0bb4464c8e1"), "x" : 4, "j" : 1 }
{ "_id" : ObjectId("517773144633b0bb4464c8e2"), "x" : 4, "j" : 2 }
{ "_id" : ObjectId("517773144633b0bb4464c8e3"), "x" : 4, "j" : 3 }
{ "_id" : ObjectId("517773144633b0bb4464c8e4"), "x" : 4, "j" : 4 }
{ "_id" : ObjectId("517773144633b0bb4464c8e5"), "x" : 4, "j" : 5 }
{ "_id" : ObjectId("517773144633b0bb4464c8e6"), "x" : 4, "j" : 6 }
{ "_id" : ObjectId("517773144633b0bb4464c8e7"), "x" : 4, "j" : 7 }
{ "_id" : ObjectId("517773144633b0bb4464c8e8"), "x" : 4, "j" : 8 }
{ "_id" : ObjectId("517773144633b0bb4464c8e9"), "x" : 4, "j" : 9 }
{ "_id" : ObjectId("517773144633b0bb4464c8ea"), "x" : 4, "j" : 10 }
{ "_id" : ObjectId("517773144633b0bb4464c8eb"), "x" : 4, "j" : 11 }
{ "_id" : ObjectId("517773144633b0bb4464c8ec"), "x" : 4, "j" : 12 }
{ "_id" : ObjectId("517773144633b0bb4464c8ed"), "x" : 4, "j" : 13 }
{ "_id" : ObjectId("517773144633b0bb4464c8ee"), "x" : 4, "j" : 14 }
{ "_id" : ObjectId("517773144633b0bb4464c8ef"), "x" : 4, "j" : 15 }
{ "_id" : ObjectId("517773144633b0bb4464c8f0"), "x" : 4, "j" : 16 }
{ "_id" : ObjectId("517773144633b0bb4464c8f1"), "x" : 4, "j" : 17 }
{ "_id" : ObjectId("517773144633b0bb4464c8f2"), "x" : 4, "j" : 18 }
Type "it" for more
find()返回一个游标it,迭代游标能返回更多文档,具体如下:
> it
{ "_id" : ObjectId("517773144633b0bb4464c8f3"), "x" : 4, "j" : 19 }
{ "_id" : ObjectId("517773144633b0bb4464c8f4"), "x" : 4, "j" : 20 }
更多插入新文档的信息,请看后文书。
三、使用游标
当查询一个集合时,MongoDB返回一个游标对象,其包含查询结果集。mongo shell遍历游标来显示结果集。mongo shell遍历游标20次返回20条结果然后等待请求遍历剩余结果,而不是一次返回所有结果。这样能阻止mongo一次获取数千或者数百万结果。it操作允许你在shell中遍历接下来的20条结果。一如前文,游标仅仅剩余2条文档,所以仅仅显示2条文档。本小节介绍另一种游标工作方式。关于游标操作文档的更详细信息参见这里。
1、用循环遍历游标
(1)在MongoDB JavaScript Shell中,查询things集合并且将结果游标对象赋值给c变量:
var c = db.things.find()
(2)使用while循环遍历c变量并打印全结果集:
while ( c.hasNext() ) printjson( c.next() )
如果游标有文档,则hasNext()函数返回true。next()方法返回下一个文档。printjson()方法呈现一个类似于json的文档格式。操作结果如下,当然ObjectId值是唯一的:
{ "_id" : ObjectId("51776f984633b0bb4464c8df"), "name" : "mongo" }
{ "_id" : ObjectId("51776f9c4633b0bb4464c8e0"), "x" : 3 }
{ "_id" : ObjectId("517773144633b0bb4464c8e1"), "x" : 4, "j" : 1 }
{ "_id" : ObjectId("517773144633b0bb4464c8e2"), "x" : 4, "j" : 2 }
{ "_id" : ObjectId("517773144633b0bb4464c8e3"), "x" : 4, "j" : 3 }
{ "_id" : ObjectId("517773144633b0bb4464c8e4"), "x" : 4, "j" : 4 }
{ "_id" : ObjectId("517773144633b0bb4464c8e5"), "x" : 4, "j" : 5 }
{ "_id" : ObjectId("517773144633b0bb4464c8e6"), "x" : 4, "j" : 6 }
{ "_id" : ObjectId("517773144633b0bb4464c8e7"), "x" : 4, "j" : 7 }
{ "_id" : ObjectId("517773144633b0bb4464c8e8"), "x" : 4, "j" : 8 }
{ "_id" : ObjectId("517773144633b0bb4464c8e9"), "x" : 4, "j" : 9 }
{ "_id" : ObjectId("517773144633b0bb4464c8ea"), "x" : 4, "j" : 10 }
{ "_id" : ObjectId("517773144633b0bb4464c8eb"), "x" : 4, "j" : 11 }
{ "_id" : ObjectId("517773144633b0bb4464c8ec"), "x" : 4, "j" : 12 }
{ "_id" : ObjectId("517773144633b0bb4464c8ed"), "x" : 4, "j" : 13 }
{ "_id" : ObjectId("517773144633b0bb4464c8ee"), "x" : 4, "j" : 14 }
{ "_id" : ObjectId("517773144633b0bb4464c8ef"), "x" : 4, "j" : 15 }
{ "_id" : ObjectId("517773144633b0bb4464c8f0"), "x" : 4, "j" : 16 }
{ "_id" : ObjectId("517773144633b0bb4464c8f1"), "x" : 4, "j" : 17 }
{ "_id" : ObjectId("517773144633b0bb4464c8f2"), "x" : 4, "j" : 18 }
{ "_id" : ObjectId("517773144633b0bb4464c8f3"), "x" : 4, "j" : 19 }
{ "_id" : ObjectId("517773144633b0bb4464c8f4"), "x" : 4, "j" : 20 }
2、用数组操作游标
你能像操作数组一样操作游标。
(1)在MongoDB JavaScript Shell中,查询things集合并且将结果游标对象赋值给c变量:
var c = db.things.find()
(2)通过如下操作来查找数组下标为4的文档:
printjson( c[4] )
MongoDB返回结果如下:
{ "_id" : ObjectId("517773144633b0bb4464c8e3"), "x" : 4, "j" : 3 }
当通过数组下标操作游标来访问文档时,mongo调用cursor.toArray()方法并且加载所有通过游标返回的文档到RAM。当返回非常大的结果集时,mongo可能会耗尽所有可用内存。更多关于游标的信息请参看这里。
3、查询指定文档
MongoDB拥有一个丰富的查询系统,其允许你通过指定的域和值来选择和过滤集合中的文档。更多查询和读取文档信息请参看这里,还有。
通过传递一个查询文档参数给find()方法来查询集合things中指定文档,具体步骤如下:
(1)通过传递参数{name : "mongo"}给find()方法来查询name域的值为mongo的所有文档:
db.things.find( {name : "mongo"} )
MongoDB返回一个符合条件的文档:
{ "_id" : ObjectId("51776f984633b0bb4464c8df"), "name" : "mongo" }
(2)通过传递参数{x : 4}给find()方法来查询x域的值为4的所有文档:
db.things.find( {x : 4} )
MongoDB返回的结果集如下:
{ "_id" : ObjectId("517773144633b0bb4464c8e1"), "x" : 4, "j" : 1 }
{ "_id" : ObjectId("517773144633b0bb4464c8e2"), "x" : 4, "j" : 2 }
{ "_id" : ObjectId("517773144633b0bb4464c8e3"), "x" : 4, "j" : 3 }
{ "_id" : ObjectId("517773144633b0bb4464c8e4"), "x" : 4, "j" : 4 }
{ "_id" : ObjectId("517773144633b0bb4464c8e5"), "x" : 4, "j" : 5 }
{ "_id" : ObjectId("517773144633b0bb4464c8e6"), "x" : 4, "j" : 6 }
{ "_id" : ObjectId("517773144633b0bb4464c8e7"), "x" : 4, "j" : 7 }
{ "_id" : ObjectId("517773144633b0bb4464c8e8"), "x" : 4, "j" : 8 }
{ "_id" : ObjectId("517773144633b0bb4464c8e9"), "x" : 4, "j" : 9 }
{ "_id" : ObjectId("517773144633b0bb4464c8ea"), "x" : 4, "j" : 10 }
{ "_id" : ObjectId("517773144633b0bb4464c8eb"), "x" : 4, "j" : 11 }
{ "_id" : ObjectId("517773144633b0bb4464c8ec"), "x" : 4, "j" : 12 }
{ "_id" : ObjectId("517773144633b0bb4464c8ed"), "x" : 4, "j" : 13 }
{ "_id" : ObjectId("517773144633b0bb4464c8ee"), "x" : 4, "j" : 14 }
{ "_id" : ObjectId("517773144633b0bb4464c8ef"), "x" : 4, "j" : 15 }
{ "_id" : ObjectId("517773144633b0bb4464c8f0"), "x" : 4, "j" : 16 }
{ "_id" : ObjectId("517773144633b0bb4464c8f1"), "x" : 4, "j" : 17 }
{ "_id" : ObjectId("517773144633b0bb4464c8f2"), "x" : 4, "j" : 18 }
{ "_id" : ObjectId("517773144633b0bb4464c8f3"), "x" : 4, "j" : 19 }
{ "_id" : ObjectId("517773144633b0bb4464c8f4"), "x" : 4, "j" : 20 }
(3)查询条件如(B)一样,但仅仅返回j域的值,要完成这个任务只需要给find()传递第二个参数作为投射即可,具体如下:
db.things.find( {x : 4}, {j : 1} )
MongoDB返回的结果集如下:
{ "_id" : ObjectId("517773144633b0bb4464c8e1"), "j" : 1 }
{ "_id" : ObjectId("517773144633b0bb4464c8e2"), "j" : 2 }
{ "_id" : ObjectId("517773144633b0bb4464c8e3"), "j" : 3 }
{ "_id" : ObjectId("517773144633b0bb4464c8e4"), "j" : 4 }
{ "_id" : ObjectId("517773144633b0bb4464c8e5"), "j" : 5 }
{ "_id" : ObjectId("517773144633b0bb4464c8e6"), "j" : 6 }
{ "_id" : ObjectId("517773144633b0bb4464c8e7"), "j" : 7 }
{ "_id" : ObjectId("517773144633b0bb4464c8e8"), "j" : 8 }
{ "_id" : ObjectId("517773144633b0bb4464c8e9"), "j" : 9 }
{ "_id" : ObjectId("517773144633b0bb4464c8ea"), "j" : 10 }
{ "_id" : ObjectId("517773144633b0bb4464c8eb"), "j" : 11 }
{ "_id" : ObjectId("517773144633b0bb4464c8ec"), "j" : 12 }
{ "_id" : ObjectId("517773144633b0bb4464c8ed"), "j" : 13 }
{ "_id" : ObjectId("517773144633b0bb4464c8ee"), "j" : 14 }
{ "_id" : ObjectId("517773144633b0bb4464c8ef"), "j" : 15 }
{ "_id" : ObjectId("517773144633b0bb4464c8f0"), "j" : 16 }
{ "_id" : ObjectId("517773144633b0bb4464c8f1"), "j" : 17 }
{ "_id" : ObjectId("517773144633b0bb4464c8f2"), "j" : 18 }
{ "_id" : ObjectId("517773144633b0bb4464c8f3"), "j" : 19 }
{ "_id" : ObjectId("517773144633b0bb4464c8f4"), "j" : 20 }
需要注意的是:MongoDB也会返回_id域,除非显示的排除该域。
4、从集合返回单文档
调用db.collection.findone()方法从MongoDB集合返回一个单文档。findone()方法的参数与find()相同,但是返回一个文档而不是一个游标。
执行如下命令从things集合返回一个单文档:
> db.things.findOne()
{ "_id" : ObjectId("51776f984633b0bb4464c8df"), "name" : "mongo" }
关于查询文档的更多信息参见,还有。
5、在结果集中限制文档数
通过限制结果集的大小来提升性能,结果集大小通过限制应用程序从网络上接收的数据大小来实现。
通过在游标上调用limit()方法来指定结果集中的最大文档数,具体如下:
> db.things.find().limit(3)
{ "_id" : ObjectId("51776f984633b0bb4464c8df"), "name" : "mongo" }
{ "_id" : ObjectId("51776f9c4633b0bb4464c8e0"), "x" : 3 }
{ "_id" : ObjectId("517773144633b0bb4464c8e1"), "x" : 4, "j" : 1 }
四、附注
更多操作数据库、集合、文档的信息参见,还有下面:
阅读(4803) | 评论(3) | 转发(1) |