3

当使用rmongodb包并且最终对象应该是 a 时,您将如何处理MongoDB 查询的结果集(长度 > 1 ) ?list

我尝试避免在单list步执行结果集时简单地附加对象时发生的 R 典型的“按值传递”复制效率低下。但为了做到这一点,我想我需要知道查询总共返回了多少“记录”,不是吗?这样,我可以跨越一个空列表,并在单步执行结果集时将其填满——甚至更好,我可以使用lapply()等等。

这是一个小例子

示例内容

该示例取自MongoDB 网站并通过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++ 指针并不十分熟悉。

4

1 回答 1

1

我已经在http://cnub.org/rmongodb.ashx#FAQ上关于 rmongodb 的 FAQ 中回答了这个问题。 这显示了如何从查询中获取数组、列表和数据帧。

于 2012-06-01T19:30:40.753 回答