首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rmongodb:如何通过在投影查询中指定来强制字段排序?

问rmongodb:如何通过在投影查询中指定来强制字段排序?
EN

Stack Overflow用户
提问于 2016-06-18 09:57:59
回答 1查看 253关注 0票数 0

我有一些数据正在尝试使用rmongodb包从mongodb检索到R中。在某个时间点上,存储文档中字段的顺序发生了变化。

我试图通过显式指定SO question中尝试的方法来强制我的投影查询保持投影字段的顺序固定,如下所示:

代码语言:javascript
复制
data <- mongo.find.all(mongo_conn, table,
                          fields = list('id1' = 1, 'id2' = 2,
                                        'time' = 3, 'latitude' = 4,
                                        'longitude' = 5, '_id' = 0))

我似乎找不到一个好的答案。它按照字段在数据库中的顺序返回字段,当然,这些字段已更改为一个列表。

这意味着,我必须编写什么样的循环代码来将返回的结果组织到一个类似于数据帧的结构中,这会造成明显的破坏。

你知道怎样才能得到指定顺序的字段,而不是数据库中的内容吗?

EN

回答 1

Stack Overflow用户

发布于 2016-06-20 19:55:21

在你链接到的答案中写着

简单的回答是你不能这样做。

另请参阅related mongodb ticket

但是,要在data.frame-like结构中获取结果,请使用mongolite,使用它要容易得多

考虑使用mtcar数据的示例

代码语言:javascript
复制
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结构

代码语言:javascript
复制
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

或者,使用聚合框架

代码语言:javascript
复制
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

现在来点无耻的自我推销吧。我一直在研究mongolite的一个扩展,它返回一个data.table对象。这里的想法是提高返回对象的速度,但前提是返回的结果集可以使用rbindlist强制执行。

这个包是mongolitedt,而且还在开发中。

代码语言:javascript
复制
# 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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37892567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档