使用包 'rmongodb' 处理查询结果集
Posted
技术标签:
【中文标题】使用包 \'rmongodb\' 处理查询结果集【英文标题】:Processing result sets of queries with package 'rmongodb'使用包 'rmongodb' 处理查询结果集 【发布时间】:2012-05-28 22:30:40 【问题描述】:当使用 rmongodb 包并且最终对象应该是 list
时,您将如何处理 MongoDB 查询的结果集 (length > 1)?
我尝试避免在单步执行结果集时简单地附加 list
对象时发生的 R 典型的“按值传递”复制效率低下。但为了做到这一点,我想我需要知道查询总共返回了多少“记录”,不是吗?这样,我可以跨越一个空列表,并在单步执行结果集时将其填充 - 或者更好的是,我可以使用 lapply()
等。
这是一个小例子
示例内容
示例取自MongoDB Website,通过rmongodb实现
mongo <- mongo.create(db="test")
ns <- "test.foo"
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.append(buf, "x", 1)
mongo.bson.buffer.append(buf, "y", 1)
x.1 <- mongo.bson.from.buffer(buf)
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.append(buf, "x", 2)
mongo.bson.buffer.append(buf, "y", "string")
x.2 <- mongo.bson.from.buffer(buf)
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.append(buf, "x", 3)
mongo.bson.buffer.append(buf, "y", NULL)
x.3 <- mongo.bson.from.buffer(buf)
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.append(buf, "x", 4)
x.4 <- mongo.bson.from.buffer(buf)
mongo.insert.batch(mongo, ns, list(x.1, x.2, x.3, x.4))
查询
cursor <- mongo.find(mongo, ns, query=list(y=NULL))
# Alternatively
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.append(buf, "y", NULL)
query <- mongo.bson.from.buffer(buf)
cursor <- mongo.find(mongo, ns, query)
处理查询结果
这是我能想到的最好的:
out <- NULL
while (mongo.cursor.next(cursor))
out <- c(out, list(mongo.bson.to.list(mongo.cursor.value(cursor))))
out
但我正在寻找类似as.list(cursor)
或类似的东西:
# Say I could find out the length of the result set:
cursor.length <- length(cursor
out <- lapply(cursor.length, function(x)
mongo.cursor.value(cursor[[x]])
)
# Alternative:
out <- vector("list", cursor.length)
for (x in 1:cursor.length)
out[[x]] <- mongo.cursor.value(cursor[[x]])
)
这可能吗?不幸的是,我对我认为包使用的 C/C++ 指针并不十分熟悉。
【问题讨论】:
【参考方案1】:我已经在http://cnub.org/rmongodb.ashx#FAQ rmongodb 的常见问题解答中回答了这个问题。 这显示了如何从查询中获取数组、列表和数据框。
【讨论】:
以上是关于使用包 'rmongodb' 处理查询结果集的主要内容,如果未能解决你的问题,请参考以下文章