0

パッケージを使用してmongodbからRに取得しようとしているデータがありrmongodbます。ある時点で、保管された文書内のフィールドの順序が変更されました。

私は、次のように試行されたアプローチを明示的に指定することにより、射影クエリが射影されるフィールドの順序を固定するように強制しようとしています: SO question :

data <- mongo.find.all(mongo_conn, table,
                          fields = list('id1' = 1, 'id2' = 2,
                                        'time' = 3, 'latitude' = 4,
                                        'longitude' = 5, '_id' = 0))

私はこれに対する良い答えを見つけることができないようです。もちろん、変更されたDB内の順序でフィールドをリストとして返します。

つまり、返された結果を構造のようなデータ フレームに整理するためにどのようなコードを書かなければならないかという点で、明らかに大混乱を引き起こします。

DBにあるものではなく、指定された順序でフィールドを取得する方法はありますか?

4

1 に答える 1

1

リンク先の回答には、

簡単な答えは、これはできないということです。

関連するmongodbチケットも参照してください

ただし、 のdata.frameような構造で結果を取得するには、 を使用します。操作mongoliteははるかに簡単です。

mtcarsデータを使用したこの例を考えてみましょう

data("mtcars")

library(mongolite)  

mongo <- mongo(db = "test",
               collection = "mtcars",
               url = "mongodb://localhost")

## insert into database
mongo$insert(mtcars)
# Complete! Processed total of 32 rows.
# [1] TRUE

mongolite::findクエリ結果を data.frame 構造に自動的に単純化します

df_results <- mongo$find()
# Imported 32 records. Simplifying into dataframe...

head(df_results)
#                     mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
# Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
# Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
# Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
# Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

または、集約フレームワークを使用して

mongo$aggregate(pipeline = '[{ "$project" : { "mpg" : 1, "wt" : 1, "_id" : 0}  },
                             { "$limit" : 5 }]')

# Imported 5 records. Simplifying into dataframe...
#     mpg    wt
# 1 21.0 2.620
# 2 21.0 2.875
# 3 22.8 2.320
# 4 21.4 3.215
# 5 18.7 3.440

そして今、ちょっと恥知らずな自己宣伝のために. 私は、data.table オブジェクトを返す mongolite の拡張に取り組んできました。ここでの考え方は、返されるオブジェクトの速度を上げることですが、返される結果セットが を使用して強制できる場合に限りますrbindlist

パッケージはmongolitedtで、まだ開発中です。

# devtools::install_github("SymbolixAU/mongolitedt")
library(mongolitedt)

bind_mongolitedt(mongo)

mongo$aggregatedt(pipeline = '[{ "$project" : { "mpg" : 1, "wt" : 1, "_id" : 0}  },
                             { "$limit" : 5 }]')

## now have a data.table object returned
#  Imported 5 records.
#     mpg    wt
# 1: 21.0 2.620
# 2: 21.0 2.875
# 3: 22.8 2.320
# 4: 21.4 3.215
# 5: 18.7 3.440

## clean up
rm(mongo); gc()
于 2016-06-20T11:55:20.900 に答える