首先,要安裝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進行操做。函數
最後刪除對象,並斷開鏈接。測試
install.packages(rmongodb)
library(rmongodb)
mongo<-mongo.create(host="192.168.1.11")
print(mongo.is.connected(mongo))
db<-"foobar"
ns<-"foobar.blog"
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)
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.destroy(mongo)
批量插入數據,使用修改器批量修改數據。
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)) }
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) } }
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) } }
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) } }
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