Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4774044
  • 博文数量: 291
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7924
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-06 14:28
个人简介

阿里巴巴是个快乐的青年

文章分类

全部博文(291)

文章存档

2018年(21)

2017年(4)

2016年(5)

2015年(17)

2014年(68)

2013年(174)

2012年(2)

分类: NOSQL

2013-04-24 17:14:54

一、连接数据库
        首先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 }

四、附注
        更多操作数据库、集合、文档的信息参见,还有下面:
                       
        



阅读(3855) | 评论(3) | 转发(1) |
给主人留下些什么吧!~~

scq2099yt2013-04-25 22:29:34

cwlalx:最近也想研究一下Mongodb。拜读,希望及时更新啊

感谢关注,我会再接再厉的

回复 | 举报

cwlalx2013-04-25 15:38:46

scq2099yt文明上网,理性发言...

最近也想研究一下Mongodb。拜读,希望及时更新啊

回复 | 举报

scq2099yt2013-04-24 17:20:54

文明上网,理性发言...