R语言与MongoDB的联合使用

最后修改时间:2019-06-21 16:34:38

一、简介
首先,要安装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对象。

{
        "_id" : ObjectId("51663e14da2c51b1e8bc62eb"),
        "name" : "Echo",
        "age" : 22,
        "gender" : "Male",
        "score" : {
                "Mike" : 5,
                "Jimmy" : 3.5,
                "Ann" : 4
        },
        "comments" : [
                "a1",
                "a2",
                "a3"
        ]
}
然后,分别使用修改器inc,set,$push进行操作。

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



安装rmongodb
install.packages(rmongodb)
加载类库
library(rmongodb)
远程连接mongodb server
mongo<-mongo.create(host="192.168.1.11")
查看是否连接正常
print(mongo.is.connected(mongo))
定义db
db<-"foobar"
定义db.collection
ns<-"foobar.blog"
组织bson类型数据
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.append(buf, "name", "Echo")
mongo.bson.buffer.append(buf, "age", 22L)
mongo.bson.buffer.append(buf, "gender", 'Male')
#对象类型
score <- c(5, 3.5, 4)
names(score) <- c("Mike", "Jimmy", "Ann")
mongo.bson.buffer.append(buf, "score", score)
#数组类型
mongo.bson.buffer.start.array(buf, "comments")
mongo.bson.buffer.append(buf, "0", "a1")
mongo.bson.buffer.append(buf, "1", "a2")
mongo.bson.buffer.append(buf, "2", "a3")
mongo.bson.buffer.finish.object(buf)
b <- mongo.bson.from.buffer(buf)


二、数据插入、删除操作
插入mongodb
mongo.insert(mongo,ns,b)
单条显示插入的数据

buf <- mongo.bson.buffer.create()
mongo.bson.buffer.append(buf, "name", "Echo")
query <- mongo.bson.from.buffer(buf)
print(mongo.find.one(mongo, ns, query))
使用$inc修改器,修改给age加1

buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.object(buf, "$inc")
mongo.bson.buffer.append(buf, "age", 1L)
mongo.bson.buffer.finish.object(buf)
objNew <- mongo.bson.from.buffer(buf)
mongo.update(mongo, ns, query, objNew)
print(mongo.find.one(mongo, ns, query))
使用$set修改器,修改age=1

buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.object(buf, "$set")
mongo.bson.buffer.append(buf, "age", 1L)
mongo.bson.buffer.finish.object(buf)
objNew <- mongo.bson.from.buffer(buf)
mongo.update(mongo, ns, query, objNew)
print(mongo.find.one(mongo, ns, query))
使用$push修改器,给comments数组追加”Orange”数据

buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.object(buf, "$push")
mongo.bson.buffer.append(buf, "comments", "Orange")
mongo.bson.buffer.finish.object(buf)
objNew <- mongo.bson.from.buffer(buf)
mongo.update(mongo, ns, query, objNew)
print(mongo.find.one(mongo, ns, query))
使用简化修改语句,给对象重新赋值

mongo.update(mongo, ns, query, list(name="Echo", age=25))
print(mongo.find.one(mongo, ns, query))
删除对象
mongo.remove(mongo, ns, query)

销毁mongo连接
mongo.destroy(mongo)

三、rmongodb测试案例
批量插入数据,使用修改器批量修改数据。

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

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

批量插入数据函数
batch_insert<-function(arr=1:10,ns){
    library(stringr)
    mongo_insert<-function(x){
      buf <- mongo.bson.buffer.create()
      mongo.bson.buffer.append(buf, "name", str_c("Dave",x))
      mongo.bson.buffer.append(buf, "age", x)
      mongo.bson.buffer.start.array(buf, "comments")
      mongo.bson.buffer.append(buf, "0", "a1")
      mongo.bson.buffer.append(buf, "1", "a2")
      mongo.bson.buffer.append(buf, "2", "a3")
      mongo.bson.buffer.finish.object(buf)
      return(mongo.bson.from.buffer(buf))
    }
    mongo.insert.batch(mongo, ns, lapply(arr,mongo_insert))
  }


批量修改,$inc修改器函数
batch_inc<-function(data,ns){
    for(i in data){
      buf <- mongo.bson.buffer.create()
      mongo.bson.buffer.append(buf, "name", str_c("Dave",i))
      criteria <- mongo.bson.from.buffer(buf)
      buf <- mongo.bson.buffer.create()
      mongo.bson.buffer.start.object(buf, "$inc")
      mongo.bson.buffer.append(buf, "age", 1L)
      mongo.bson.buffer.finish.object(buf)
      objNew <- mongo.bson.from.buffer(buf)
      mongo.update(mongo, ns, criteria, objNew)
    }
  }


批量修改,$set修改器函数
 batch_set<-function(data,ns){
    for(i in data){
      buf <- mongo.bson.buffer.create()
      mongo.bson.buffer.append(buf, "name", str_c("Dave",i))
      criteria <- mongo.bson.from.buffer(buf)
      buf <- mongo.bson.buffer.create()
      mongo.bson.buffer.start.object(buf, "$set")
      mongo.bson.buffer.append(buf, "age", 1L)
      mongo.bson.buffer.finish.object(buf)
      objNew <- mongo.bson.from.buffer(buf)
      mongo.update(mongo, ns, criteria, objNew)
    }
  }


批量修改,$push修改器函数
 batch_push<-function(data,ns){
    for(i in data){
      buf <- mongo.bson.buffer.create()
      mongo.bson.buffer.append(buf, "name", str_c("Dave",i))
      criteria <- mongo.bson.from.buffer(buf)
      buf <- mongo.bson.buffer.create()
      mongo.bson.buffer.start.object(buf, "$push")
      mongo.bson.buffer.append(buf, "comments", "Orange")
      mongo.bson.buffer.finish.object(buf)
      objNew <- mongo.bson.from.buffer(buf)
      mongo.update(mongo, ns, criteria, objNew)
    }
  }


执行程序,3种修改速度比较,$push最慢
ns="foobar.blog"
 data=1:1000 mongo.remove(mongo, ns) ## [1] TRUE 
system.time(batch_insert(data, ns)) ## user system elapsed ## 0.25 0.00 
0.28 system.time(batch_inc(data, ns)) ## user system elapsed ## 0.47 
0.27 2.50 system.time(batch_set(data, ns)) ## user system elapsed ## 
0.77 0.48 3.17 system.time(batch_push(data, ns)) ## user system elapsed 
## 0.81 0.41 4.23

收藏 0 0

共0条 1

登录 后发表评论。没有帐号? 注册 一个。