使用包 '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' 处理查询结果集的主要内容,如果未能解决你的问题,请参考以下文章

rmongodb: $exists 给出空结果

精通Mybatis之结果集处理流程与映射体系(联合查询与嵌套映射)

使用 rmongodb 连接到 MongoDB 副本集

Impala在处理结果集较大的查询的优势

oracle 存储过程,数据处理并返回结果集问题

结果集需要很长时间来处理来自 Oracle 的大数据