R语言与MongoDB的联合使用

1、简介

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

而后,经过mongo.create()函数,创建与MongoDB Server的链接。若是是本地链接,mongo.create()不要参数,下面例子使用远程链接,增长host参数配置IP地址。 mongo<-mongo.create(host=“192.168.1.11”)shell

检查是否链接正常,mongo.is.connected()。这条语句在开发时会常常使用到。在用R语言建模时,若是对象或者函数使用错误,链接会被自动断开。因为MongoDB的异常机制,断开时不会是提示。你们要手动使用这条命令测试,链接是否正常。数据库

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

下面咱们建立一个Mongo对象。app

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


2、数据插入、删除操做

插入mongodb

mongo.insert(mongo,ns,b)

单条显示插入的数据spa

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加1code

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=1orm

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)

3、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
相关文章
相关标签/搜索