2013-06-14 5 views
0

MongoDB 명령 줄에서 그룹 방법을 사용할 수 있다는 것을 알고 있지만 rmongodb 라이브러리에서 이러한 작업을 수행하는 방법을 찾을 수 없습니다. 지금은 모든 값을 일부 매개 변수로 필터링 한 다음 거기에 존재하지 않는 경우 새로운 데이터 프레임을 추가하는 루프를 철저히 조사해야합니다.MongoDB에서 고유 한 필드 집합 가져 오기

cursor = mongo.find(mongo, "db.col", list(filterfield="filtervalue"), fields = list(f1=1L, f2=1L)) 
df = data.frame(f1=character(0), f2=character(0), stringsAsFactors=FALSE) 
while(mongo.cursor.next(cursor)){ 
    newf1 = list(mongo.bson.to.list(mongo.cursor.value(cursor)))[[1]]$f1 
    newf2 = list(mongo.bson.to.list(mongo.cursor.value(cursor)))[[1]]$f2 
    if(nrow(subset(df, df$f1 == newf1 & df$f2 == newf2)) < 1){ 
    df[nrow(df) + 1, ] = c(newf1, newf2) 
    } 
} 

그것은 MongoDB에 그것을 그룹화하기 때문에 매우 비효율적 인 것은 직접 MongoDB의 명령을 통해 간단한 방법이 있나요 ... 크기 짧은 시간의 주문을한다?

답변

1

그렇게 쉽지는 않지만 다음과 같이 할 수 있습니다 .-). 가장 큰 문제는 bson 쿼리를 만들고 mongodb의 runCommand 구문을 사용하는 것입니다. 다음은 docs.mongodb.org에서 찾을 수있는 몇 가지 예제 코드와 데이터입니다.

예제 SQL 쿼리는 다음과 같이 수 : MongoDB의에서

SELECT state, SUM(pop) AS totalPop FROM zips GROUP BY state 
HAVING pop > (10000) 

은 이런 식으로 뭔가를 실행 쉘.

db.zipcodes.aggregate({ $group : 
         { _id : "$state", 
         totalPop : { $sum : "$pop" } 
         } }, 
         { $match : {totalPop : { $gte : 10000 } } } 
        ) 

당신은 통합 프레임 워크에 대한 다음과 같은 기본 구문은 명령 db.runCommand와 같은 실행할 수 있습니다

db.runCommand(
{ aggregate : "article", pipeline : [ 
    { $project : {author : 1,tags : 1} 
    }, 
    { $unwind : "$tags" }, 
    { $group : { 
     _id : "$tags", 
     authors : { $addToSet : "$author" } 
     } 
    } 
    ] } 
); 

이제 다음 코드로 rmongodb에서 동일한 작업을 수행 할 수 있습니다 :

buf <- mongo.bson.buffer.create() 
mongo.bson.buffer.append(buf, "aggregate", "zips") 
    mongo.bson.buffer.start.array(buf, "pipeline") 
    mongo.bson.buffer.start.object(buf, "$group") 
    mongo.bson.buffer.append(buf, "_id", "$state") 
     mongo.bson.buffer.start.object(buf, "totalPop") 
     mongo.bson.buffer.append(buf, "$sum", "$pop") 
     mongo.bson.buffer.finish.object(buf) 
    mongo.bson.buffer.finish.object(buf) 
    mongo.bson.buffer.start.object(buf, "$match") 
     mongo.bson.buffer.start.object(buf, "totalPop") 
     mongo.bson.buffer.append(buf, "$gte", "10000") 
     mongo.bson.buffer.finish.object(buf) 
    mongo.bson.buffer.finish.object(buf) 
    mongo.bson.buffer.finish.object(buf) 
query <- mongo.bson.from.buffer(buf) 

res <- mongo.command(mongo, "test", query) 

out <- mongo.bson.to.list(res) 

이것이 작동하지 않는 경우 알려주십시오.