2016-06-18 5 views
0

rmongodb 패키지를 사용하여 mongodb에서 R로 검색하려고하는 일부 데이터가 있습니다. 어느 시점에서 저장된 문서의 필드 순서가 변경되었습니다. 다음과 같이 SO question : I 명시 적 접근 방식을 지정하여 고정 투영 된 필드의 순서를 유지하기 위해 내 프로젝션 쿼리를 강제하려고rmongodb : 프로젝션 쿼리에서 필드 순서를 지정하는 법?

는에 시도

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

나는에 좋은 답변을 찾을 수없는 것 이. DB에있는 순서대로 필드를 반환합니다. 변경된 필드는 물론 목록입니다.

즉, 반환 된 결과를 구조와 같은 데이터 프레임으로 구성하기 위해 작성해야하는 루피 코드가 무엇인지 분명히 알 수 있습니다.

DB에서 무엇이 아닌 지정된 순서로 필드를 가져올 수 있습니까? 당신이 그것에 연결이 질문에

+0

[$ project] (https://docs.mongodb.com/manual/reference/operator/aggregation/project/) 내가 생각하는 해결책이 될 것입니다. – Shrabanee

+0

당신이 묻고있는 것에 대해 확실하지 않습니다. 예제 데이터 및/또는 예상 결과를 제공 할 수 있습니까? R에서 정렬을 할 수없고 어 그리 게이션 프레임 워크를 사용하지 않는 이유는 무엇입니까? – SymbolixAU

+0

데이터베이스에서 어느 시점에서 위의 필드를 각 문서에 저장하는 순서가 변경되었습니다. MongoDB는이 필드들을 데이터베이스에 나타나는 순서대로 리턴합니다. 내가 지정한 순서대로 돌려 주길 바란다. 물론, 나는 내가하고있는 R에서 다시 주문할 수있다. 하지만, 전체 데이터 (목록 반환)를 실행하고 목록의 각 항목을 정렬해야합니다. – Gopala

답변

1

간단한 대답은 당신이 할 수없는 것을 말한다. 또한

mtcars에게 데이터

를 사용하여이 예를 고려가

작업을 훨씬 쉽게, mongolite을 사용합니다 data.frame -like 구조에 결과를 얻을 수 그러나 related mongodb ticket

참조

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은 쿼리 결과를 자동으로 단순화합니다. 집계 프레임 워크 뻔뻔한 자기 홍보의 비트에 대한


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.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 

또는,로. 나는 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() 
+0

'mongolitedt'는 흥미 롭습니다 .. 앞으로 기대해주세요 .. – Arun

+0

@Arun - 더 나아질 수 있습니다. C 프로그래밍을 배우고 개선해야합니다. – SymbolixAU

+0

@Arun - [thanks to [# 1659] (https : /) /github.com/Rdatatable/data.table/issues/1659) - 이제'_id' 필드를 반환 할 수 있습니다 :) – SymbolixAU