3

rmongodbパッケージを使用し、最終オブジェクトを?にする場合、MongoDBクエリの結果セット(長さ> 1 )をどのように処理しますか?list

list結果セットをステップ実行しながらオブジェクトを追加するだけで発生する、Rの典型的な「値渡し」コピーの非効率性を回避しようとしています。しかし、それを行うには、クエリが返した「レコード」の総数を知る必要があると思いますね。そうすれば、空のリストにまたがって、結果セットをステップスルーするときにそのリストを埋めることができます。さらに良いことに、lapply()などを使用することもできます。

これが小さな例です

コンテンツの例

この例は、MongoDB Webサイトから取得され、 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 に答える