为了避免编写 mongo.bson.buffer-statements 的序列,我编写了一个包(rmongodbHelper),它将 JSON 或 list() 转换为 BSON 对象,然后可以与 rmongodb 一起使用。
首先让我们设置环境:
library(rmongodb)
# install rmongodbHelper package from GitHub
library(devtools)
devtools::install_github("joyofdata/rmongodbHelper")
library(rmongodbHelper)
# the MongoDB instance
ns <- "dbx.collx"
M <- mongo.create()
mongo.is.connected(M)
mongo.remove(M, ns, json_to_bson("{}"))
# inserting a number of dummy objects
# JSON keys currently are expected to be wrapped in double quotes!
objs <- c(
'{"a":"__int(1)"}',
'{"a":"__int(2)"}',
'{"a":"__int(3)"}'
)
for(obj in objs) {
mongo.insert(M, ns, json_to_bson(obj))
}
让我们通过 MongoDB shell 看看它们是否成功插入:
> use dbx
switched to db dbx
> db.collx.find().pretty()
{ "_id" : ObjectId("53fa14315aed8483db4ae794"), "a" : 1 }
{ "_id" : ObjectId("53fa14315aed8483db4ae795"), "a" : 2 }
{ "_id" : ObjectId("53fa14315aed8483db4ae796"), "a" : 3 }
现在让我们搜索一个等于 1:
# searching for those objects
# JSON keys currently are expected to be wrapped in double quotes!
json_qry <- '{"a":1}'
cur <- mongo.find(M, "dbx.collx", json_to_bson(json_qry))
while(mongo.cursor.next(cur)) {
print(mongo.cursor.value(cur))
}
这就是我们得到的:
_id : 7 53fa14315aed8483db4ae794
a : 16 1
最后让我们搜索一个等于 1 或 3 的值:
json_qry <-
'{
"$or": [
{"a":1},
{"a":3}
]
}'
cur <- mongo.find(M, "dbx.collx", json_to_bson(json_qry))
while(mongo.cursor.next(cur)) {
print(mongo.cursor.value(cur))
}
及其结果:
_id : 7 53fa14315aed8483db4ae794
a : 16 1
_id : 7 53fa14315aed8483db4ae796
a : 16 3
- 键 - 也像 $or 这样的运算符 - 需要放在双引号中。
"x":3
将导致 3 被转换为 double
"x":"__int(3)"
将导致 3 被转换为整数
这是使用缓冲区的解决方法:
M <- mongo.create("localhost")
mongo.is.connected(M)
buf <- mongo.bson.buffer.create()
# "$or":[ ...
mongo.bson.buffer.start.array(buf, "$or")
# dummy name "0" for object in array
# "0": { ...
mongo.bson.buffer.start.object(buf, "0")
# "a":1
mongo.bson.buffer.append.int(buf, "a", 1)
# ... }
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.start.object(buf, "1")
mongo.bson.buffer.append.int(buf, "a", 3)
mongo.bson.buffer.finish.object(buf)
# ...]
mongo.bson.buffer.finish.object(buf)
q <- mongo.bson.from.buffer(buf)
mongo.count(M, "test.xxx", q)