首先,要安装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