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
相關文章
相關標籤/搜索