R利剑NoSQL系列文章 之 MongoDB

释放双眼,带上耳机,听听看~!

R利剑NoSQL系列文章,主要介绍通过R语言连接使用nosql数据库。涉及的NoSQL产品,包括Redis,MongoDB, HBase, Hive, Cassandra, Neo4j。希望通过我的介绍让广大的R语言爱好者,有更多的开发选择,做出更多地激动人心的应用。

关于作者:

由于文章篇幅有限,均跳过NoSQL的安装过程,请自行参考文档安装。

转载请注明:
http://blog.fens.me/nosql-r-mongodb/

第一篇 R利剑MongeDB,分为4个章节。

  1. MongoDB环境准备
  2. rmongodb函数库
  3. rmongodb基本使用操作
  4. rmongodb测试案例

每一章节,都会分为”文字说明部分”和”代码部分”,保持文字说明与代码的连贯性。

1. MongoDB环境准备

文字说明部分:

首先环境准备,这里我选择了Linux Ubuntu操作系统12.04的32位桌面版本,大家可以根据自己的使用习惯选择顺手的Linux。

MongoDB安装过程跳过。

查看MongoDB服务器环境
使用mongod命令,启动MongoDB。


1
2
3
4
5
6
7
1进程号:pid=2924
2端口:port=27017
3数据文件目录:dbpath=/data/db/
4软件版本:32-bit
5主机名:host=conan
6
7

使用mongo命令,打开mongo shell。

mongo shell的简单操作:
查看数据库,切换数据库,查看数据集.

R语言环境2.15.0,WinXP通过远程连接,访问Mongodb Server。

代码部分:

查看操作系统


1
2
3
4
5
6
7
8
9
1~ uname -a
2
3    Linux conan 3.2.0-38-generic-pae #61-Ubuntu SMP Tue Feb 19 12:39:51 UTC 2013 i686 i686 i386 GNU/Linux
4
5~ cat /etc/issue
6
7    Ubuntu 12.04.2 LTS \n \l
8
9

启动mongodb


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1~ mongod
2
3    mongod --help for help and startup options
4    Thu Apr 11 11:02:26
5    Thu Apr 11 11:02:26 warning: 32-bit servers don't have journaling enabled by default. Please use --journal if you want durability.
6    Thu Apr 11 11:02:26
7    Thu Apr 11 11:02:26 [initandlisten] MongoDB starting : pid=2924 port=27017 dbpath=/data/db/ 32-bit host=conan
8    Thu Apr 11 11:02:26 [initandlisten]
9    Thu Apr 11 11:02:26 [initandlisten] ** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data
10    Thu Apr 11 11:02:26 [initandlisten] **       see http://blog.mongodb.org/post/137788967/32-bit-limitations
11    Thu Apr 11 11:02:26 [initandlisten] **       with --journal, the limit is lower
12    Thu Apr 11 11:02:26 [initandlisten]
13    Thu Apr 11 11:02:26 [initandlisten] db version v2.0.6, pdfile version 4.5
14    Thu Apr 11 11:02:26 [initandlisten] git version: e1c0cbc25863f6356aa4e31375add7bb49fb05bc
15    Thu Apr 11 11:02:26 [initandlisten] build info: Linux domU-12-31-39-01-70-B4 2.6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:39:36 EST 2008 i686 BOOST_LIB_VERSION=1_41
16    Thu Apr 11 11:02:26 [initandlisten] options: {}
17    Thu Apr 11 11:02:26 [websvr] admin web console waiting for connections on port 28017
18    Thu Apr 11 11:02:26 [initandlisten] waiting for connections on port 27017
19
20

打开mongo shell


1
2
3
4
5
6
1~ mongo
2
3    MongoDB shell version: 2.0.6
4    connecting to: test
5
6

进入mongo shell, 列表显示数据库


1
2
3
4
5
6
7
8
1> show dbs
2
3    db      0.0625GB
4    feed    0.0625GB
5    foobar  0.0625GB
6    local   (empty)
7
8

切换数据库


1
2
3
4
5
1> use foobar
2
3   switched to db foobar
4
5

列表显示数据集


1
2
3
4
5
6
1> show collections
2
3    blog
4    system.indexes
5
6

R语言开发环境2.15.0,WinXP


1
2
3
4
5
6
7
1~ R
2R version 2.15.0 (2012-03-30)
3Copyright (C) 2012 The R Foundation for Statistical Computing
4ISBN 3-900051-07-0
5Platform: i386-pc-mingw32/i386 (32-bit)
6
7

2. rmongodb函数库

文字说明部分:

rmongodb的开发了一大堆的函数,对应mongo的操作。比起别的NoSQL来说,真是工程浩大啊。但我总觉得封装粒度不够,写起代码来比较复杂。

下面列出了所有rmongodb函数库,我只挑选几个常用的介绍。

建立mongo连接


1
2
3
1mongo<-mongo.create()
2
3

查看接连是否正常


1
2
3
1mongo.is.connected(mongo)
2
3

创建一个BSON对象缓存


1
2
3
1buf <- mongo.bson.buffer.create()
2
3

给对象buf增加element


1
2
3
1mongo.bson.buffer.append(buf, "name", "Echo")
2
3

增加对象类型的element


1
2
3
4
5
1score <- c(5, 3.5, 4)
2names(score) <- c("Mike", "Jimmy", "Ann")
3mongo.bson.buffer.append(buf, "score", score)
4
5

增加数组类型的element


1
2
3
4
5
6
1mongo.bson.buffer.start.array(buf, "comments")
2mongo.bson.buffer.append(buf, "0", "a1")
3mongo.bson.buffer.append(buf, "1", "a2")
4mongo.bson.buffer.append(buf, "2", "a3")
5
6

关闭数组类型的element


1
2
3
1mongo.bson.buffer.finish.object(buf)
2
3

取出缓存数据


1
2
3
1b <- mongo.bson.from.buffer(buf)
2
3

数据库.数据集


1
2
3
1ns="db.blog"
2
3

插入一条记录


1
2
3
4
5
6
1mongo.insert(mongo,ns,b)
2
3#mongo shell:(Not Run)
4db.blog.insert(b)
5
6

创建查询对象query


1
2
3
4
5
1buf <- mongo.bson.buffer.create()
2mongo.bson.buffer.append(buf, "name", "Echo")
3query <- mongo.bson.from.buffer(buf)
4
5

创建查询返回值对象


1
2
3
4
5
1buf <- mongo.bson.buffer.create()
2mongo.bson.buffer.append(buf, "name", 1)
3fields <- mongo.bson.from.buffer(buf)
4
5

执行单条记录查询


1
2
3
4
5
6
1mongo.find.one(mongo, ns, query, fields)
2
3#mongo shell:(Not Run)
4db.blog.findOne({query},{fields})
5
6

执行列表记录查询


1
2
3
4
5
6
1mongo.find(mongo, ns, query, fields)
2
3#mongo shell:(Not Run)
4db.blog.find({query},{fields})
5
6

创建修改器对象objNew


1
2
3
4
5
6
7
1buf <- mongo.bson.buffer.create()
2mongo.bson.buffer.start.object(buf, "$inc")
3mongo.bson.buffer.append(buf, "age", 1L)
4mongo.bson.buffer.finish.object(buf)
5objNew <- mongo.bson.from.buffer(buf)
6
7

执行修改操作


1
2
3
4
5
6
1mongo.update(mongo, ns, query, objNew)
2
3#mongo shell:(Not Run)
4db.blog.update({query},{objNew})
5
6

单行代码修改操作


1
2
3
4
5
6
1mongo.update(mongo, ns, query, list(name="Echo", age=25))
2
3#mongo shell:(Not Run)
4db.blog.update({query},{objNew})
5
6

删除所选对象


1
2
3
4
5
6
1mongo.remove(mongo, ns, query)
2
3#mongo shell:(Not Run)
4db.blog.remove({query},{objNew})
5
6

销毁mongo连接


1
2
3
1mongo.destroy(mongo)
2
3

代码部分:

共有153个函数


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
1mongo.add.user
2mongo.authenticate
3mongo.binary.binary
4mongo.binary.function
5mongo.binary.md5
6mongo.binary.old
7mongo.binary.user
8mongo.binary.uuid
9mongo.bson.array
10mongo.bson.binary
11mongo.bson.bool
12mongo.bson.buffer.append
13mongo.bson.buffer.append.bool
14mongo.bson.buffer.append.bson
15mongo.bson.buffer.append.code
16mongo.bson.buffer.append.code.w.scope
17mongo.bson.buffer.append.complex
18mongo.bson.buffer.append.double
19mongo.bson.buffer.append.element
20mongo.bson.buffer.append.int
21mongo.bson.buffer.append.list
22mongo.bson.buffer.append.long
23mongo.bson.buffer.append.null
24mongo.bson.buffer.append.object
25mongo.bson.buffer.append.oid
26mongo.bson.buffer.append.raw
27mongo.bson.buffer.append.regex
28mongo.bson.buffer.append.string
29mongo.bson.buffer.append.symbol
30mongo.bson.buffer.append.time
31mongo.bson.buffer.append.timestamp
32mongo.bson.buffer.append.undefined
33mongo.bson.buffer.create
34mongo.bson.buffer.finish.object
35mongo.bson.buffer.size
36mongo.bson.buffer.start.array
37mongo.bson.buffer.start.object
38mongo.bson.code
39mongo.bson.code.w.scope
40mongo.bson.date
41mongo.bson.dbref
42mongo.bson.destroy
43mongo.bson.double
44mongo.bson.empty
45mongo.bson.eoo
46mongo.bson.find
47mongo.bson.from.buffer
48mongo.bson.from.list
49mongo.bson.int
50mongo.bson.iterator.create
51mongo.bson.iterator.key
52mongo.bson.iterator.next
53mongo.bson.iterator.type
54mongo.bson.iterator.value
55mongo.bson.long
56mongo.bson.null
57mongo.bson.object
58mongo.bson.oid
59mongo.bson.print
60mongo.bson.regex
61mongo.bson.size
62mongo.bson.string
63mongo.bson.symbol
64mongo.bson.timestamp
65mongo.bson.to.list
66mongo.bson.undefined
67mongo.bson.value
68mongo.code.create
69mongo.code.w.scope.create
70mongo.command
71mongo.count
72mongo.create
73mongo.cursor.destroy
74mongo.cursor.next
75mongo.cursor.value
76mongo.destroy
77mongo.disconnect
78mongo.distinct
79mongo.drop
80mongo.drop.database
81mongo.find
82mongo.find.await.data
83mongo.find.cursor.tailable
84mongo.find.exhaust
85mongo.find.no.cursor.timeout
86mongo.find.one
87mongo.find.oplog.replay
88mongo.find.partial.results
89mongo.find.slave.ok
90mongo.get.database.collections
91mongo.get.databases
92mongo.get.err
93mongo.get.hosts
94mongo.get.last.err
95mongo.get.prev.err
96mongo.get.primary
97mongo.get.server.err
98mongo.get.server.err.string
99mongo.get.socket
100mongo.get.timeout
101mongo.gridfile.destroy
102mongo.gridfile.get.chunk
103mongo.gridfile.get.chunk.count
104mongo.gridfile.get.chunks
105mongo.gridfile.get.chunk.size
106mongo.gridfile.get.content.type
107mongo.gridfile.get.descriptor
108mongo.gridfile.get.filename
109mongo.gridfile.get.length
110mongo.gridfile.get.md5
111mongo.gridfile.get.metadata
112mongo.gridfile.get.upload.date
113mongo.gridfile.pipe
114mongo.gridfile.read
115mongo.gridfile.seek
116mongo.gridfile.writer.create
117mongo.gridfile.writer.finish
118mongo.gridfile.writer.write
119mongo.gridfs.create
120mongo.gridfs.destroy
121mongo.gridfs.find
122mongo.gridfs.remove.file
123mongo.gridfs.store
124mongo.gridfs.store.file
125mongo.index.background
126mongo.index.create
127mongo.index.drop.dups
128mongo.index.sparse
129mongo.index.unique
130mongo.insert
131mongo.insert.batch
132mongo.is.connected
133mongo.is.master
134mongo.oid.create
135mongo.oid.from.string
136mongo.oid.print
137mongo.oid.time
138mongo.oid.to.string
139mongo.reconnect
140mongo.regex.create
141mongo.remove
142mongo.rename
143mongo.reset.err
144mongo.set.timeout
145mongo.shorthand
146mongo.simple.command
147mongo.symbol.create
148mongo.timestamp.create
149mongo.undefined.create
150mongo.update
151mongo.update.basic
152mongo.update.multi
153mongo.update.upsert
154
155

3. rmongodb基本使用操作

文字说明部分:

首先,要安装rmongodb类库,加载类库。

然后,通过mongo.create()函数,建立与MongoDB Server的连接。如果是本地连接,mongo.create()不要参数,下面例子使用远程连接,增加host参数配置IP地址。mongo<-mongo.create(host=“192.168.1.11”)

检查是否连接正常,mongo.is.connected()。这条语句在开发时会经常使用到。在用R语言建模时,如果对象或者函数使用错误,连接会被自动断开。由于MongoDB的异常机制,断开时不会是提示。大家要手动使用这条命令测试,连接是否正常。

接下来,定义两个变量,db和ns。db是我们需要使用的数据库,ns是数据库+数据集。

下面我们创建一个Mongo对象。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1{
2        &quot;_id&quot; : ObjectId(&quot;51663e14da2c51b1e8bc62eb&quot;),
3        &quot;name&quot; : &quot;Echo&quot;,
4        &quot;age&quot; : 22,
5        &quot;gender&quot; : &quot;Male&quot;,
6        &quot;score&quot; : {
7                &quot;Mike&quot; : 5,
8                &quot;Jimmy&quot; : 3.5,
9                &quot;Ann&quot; : 4
10        },
11        &quot;comments&quot; : [
12                &quot;a1&quot;,
13                &quot;a2&quot;,
14                &quot;a3&quot;
15        ]
16}
17
18

然后,分别使用修改器$inc,$set,$push进行操作。

最后删除对象,并断开连接。

代码部分:

安装rmongodb


1
2
3
1install.packages(rmongodb)
2
3

加载类库


1
2
3
1library(rmongodb)
2
3

远程连接mongodb server


1
2
3
1mongo&lt;-mongo.create(host=&quot;192.168.1.11&quot;)
2
3

查看是否连接正常


1
2
3
1print(mongo.is.connected(mongo))
2
3

定义db


1
2
3
1db&lt;-&quot;foobar&quot;
2
3

定义db.collection


1
2
3
1ns&lt;-&quot;foobar.blog&quot;
2
3

组织bson类型数据


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1buf &lt;- mongo.bson.buffer.create()
2mongo.bson.buffer.append(buf, &quot;name&quot;, &quot;Echo&quot;)
3mongo.bson.buffer.append(buf, &quot;age&quot;, 22L)
4mongo.bson.buffer.append(buf, &quot;gender&quot;, &#x27;Male&#x27;)
5
6#对象类型
7score &lt;- c(5, 3.5, 4)
8names(score) &lt;- c(&quot;Mike&quot;, &quot;Jimmy&quot;, &quot;Ann&quot;)
9mongo.bson.buffer.append(buf, &quot;score&quot;, score)
10
11#数组类型
12mongo.bson.buffer.start.array(buf, &quot;comments&quot;)
13mongo.bson.buffer.append(buf, &quot;0&quot;, &quot;a1&quot;)
14mongo.bson.buffer.append(buf, &quot;1&quot;, &quot;a2&quot;)
15mongo.bson.buffer.append(buf, &quot;2&quot;, &quot;a3&quot;)
16mongo.bson.buffer.finish.object(buf)
17b &lt;- mongo.bson.from.buffer(buf)
18
19

插入mongodb


1
2
3
1mongo.insert(mongo,ns,b)
2
3

单条显示插入的数据


1
2
3
4
5
6
1buf &lt;- mongo.bson.buffer.create()
2mongo.bson.buffer.append(buf, &quot;name&quot;, &quot;Echo&quot;)
3query &lt;- mongo.bson.from.buffer(buf)
4print(mongo.find.one(mongo, ns, query))
5
6

使用$inc修改器,修改给age加1


1
2
3
4
5
6
7
8
9
1buf &lt;- mongo.bson.buffer.create()
2mongo.bson.buffer.start.object(buf, &quot;$inc&quot;)
3mongo.bson.buffer.append(buf, &quot;age&quot;, 1L)
4mongo.bson.buffer.finish.object(buf)
5objNew &lt;- mongo.bson.from.buffer(buf)
6mongo.update(mongo, ns, query, objNew)
7print(mongo.find.one(mongo, ns, query))
8
9

使用$set修改器,修改age=1


1
2
3
4
5
6
7
8
9
1buf &lt;- mongo.bson.buffer.create()
2mongo.bson.buffer.start.object(buf, &quot;$set&quot;)
3mongo.bson.buffer.append(buf, &quot;age&quot;, 1L)
4mongo.bson.buffer.finish.object(buf)
5objNew &lt;- mongo.bson.from.buffer(buf)
6mongo.update(mongo, ns, query, objNew)
7print(mongo.find.one(mongo, ns, query))
8
9

使用$push修改器,给comments数组追加”Orange”数据


1
2
3
4
5
6
7
8
9
1buf &lt;- mongo.bson.buffer.create()
2mongo.bson.buffer.start.object(buf, &quot;$push&quot;)
3mongo.bson.buffer.append(buf, &quot;comments&quot;, &quot;Orange&quot;)
4mongo.bson.buffer.finish.object(buf)
5objNew &lt;- mongo.bson.from.buffer(buf)
6mongo.update(mongo, ns, query, objNew)
7print(mongo.find.one(mongo, ns, query))
8
9

使用简化修改语句,给对象重新赋值


1
2
3
4
1mongo.update(mongo, ns, query, list(name=&quot;Echo&quot;, age=25))
2print(mongo.find.one(mongo, ns, query))
3
4

删除对象


1
2
3
1mongo.remove(mongo, ns, query)
2
3

销毁mongo连接


1
2
3
1mongo.destroy(mongo)
2
3

4. rmongodb测试案例

文字说明部分:

批量插入数据,使用修改器批量修改数据

3种修改器速度比较,$push最慢
$push > $set > $inc

终于push是对数组操作,set是对任意值操作,inc是对数字操作,所以下面测试可能不太公平。测试结果仅供参考。

代码部分:

批量插入数据函数


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1  batch_insert&lt;-function(arr=1:10,ns){
2    library(stringr)
3    mongo_insert&lt;-function(x){
4      buf &lt;- mongo.bson.buffer.create()
5      mongo.bson.buffer.append(buf, &quot;name&quot;, str_c(&quot;Dave&quot;,x))
6      mongo.bson.buffer.append(buf, &quot;age&quot;, x)
7      mongo.bson.buffer.start.array(buf, &quot;comments&quot;)
8      mongo.bson.buffer.append(buf, &quot;0&quot;, &quot;a1&quot;)
9      mongo.bson.buffer.append(buf, &quot;1&quot;, &quot;a2&quot;)
10      mongo.bson.buffer.append(buf, &quot;2&quot;, &quot;a3&quot;)
11      mongo.bson.buffer.finish.object(buf)
12      return(mongo.bson.from.buffer(buf))
13    }
14    mongo.insert.batch(mongo, ns, lapply(arr,mongo_insert))
15  }
16
17

批量修改,$inc修改器函数


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1  batch_inc&lt;-function(data,ns){
2    for(i in data){
3      buf &lt;- mongo.bson.buffer.create()
4      mongo.bson.buffer.append(buf, &quot;name&quot;, str_c(&quot;Dave&quot;,i))
5      criteria &lt;- mongo.bson.from.buffer(buf)
6      buf &lt;- mongo.bson.buffer.create()
7      mongo.bson.buffer.start.object(buf, &quot;$inc&quot;)
8      mongo.bson.buffer.append(buf, &quot;age&quot;, 1L)
9      mongo.bson.buffer.finish.object(buf)
10      objNew &lt;- mongo.bson.from.buffer(buf)
11      mongo.update(mongo, ns, criteria, objNew)
12    }
13  }
14
15

批量修改,$set修改器函数


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1  batch_set&lt;-function(data,ns){
2    for(i in data){
3      buf &lt;- mongo.bson.buffer.create()
4      mongo.bson.buffer.append(buf, &quot;name&quot;, str_c(&quot;Dave&quot;,i))
5      criteria &lt;- mongo.bson.from.buffer(buf)
6      buf &lt;- mongo.bson.buffer.create()
7      mongo.bson.buffer.start.object(buf, &quot;$set&quot;)
8      mongo.bson.buffer.append(buf, &quot;age&quot;, 1L)
9      mongo.bson.buffer.finish.object(buf)
10      objNew &lt;- mongo.bson.from.buffer(buf)
11      mongo.update(mongo, ns, criteria, objNew)
12    }
13  }
14
15

批量修改,$push修改器函数


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1  batch_push&lt;-function(data,ns){
2    for(i in data){
3      buf &lt;- mongo.bson.buffer.create()
4      mongo.bson.buffer.append(buf, &quot;name&quot;, str_c(&quot;Dave&quot;,i))
5      criteria &lt;- mongo.bson.from.buffer(buf)
6      buf &lt;- mongo.bson.buffer.create()
7      mongo.bson.buffer.start.object(buf, &quot;$push&quot;)
8      mongo.bson.buffer.append(buf, &quot;comments&quot;, &quot;Orange&quot;)
9      mongo.bson.buffer.finish.object(buf)
10      objNew &lt;- mongo.bson.from.buffer(buf)
11      mongo.update(mongo, ns, criteria, objNew)
12    }
13  }
14
15

执行程序,3种修改速度比较,$push最慢


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1  ns=&quot;foobar.blog&quot;
2  data=1:1000
3
4  mongo.remove(mongo, ns)
5  ## [1] TRUE
6
7  system.time(batch_insert(data, ns))
8  ##    user  system elapsed
9  ##    0.25    0.00    0.28
10
11  system.time(batch_inc(data, ns))
12  ##    user  system elapsed
13  ##    0.47    0.27    2.50
14
15  system.time(batch_set(data, ns))
16  ##    user  system elapsed
17  ##    0.77    0.48    3.17
18
19  system.time(batch_push(data, ns))
20  ##    user  system elapsed
21  ##    0.81    0.41    4.23
22
23

转载请注明:
http://blog.fens.me/nosql-r-mongodb/

R利剑NoSQL系列文章 之 MongoDB

This entry was posted in R语言实践

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索