0

MongoDB コマンド ラインでグループ メソッドを使用できることはわかっていますが、rmongodb ライブラリでそのようなタスクを実行する方法が見つかりません。現時点では、いくつかのパラメーターでフィルター処理されたすべての値を取得し、そこに存在しない場合に備えて、それらを新しいデータ フレームに追加してループする必要があります。

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コマンドを使用する簡単な方法はありますか?

4

1 に答える 1

1

それほど簡単ではありませんが、できます:-)。最も難しいのは、bson クエリを作成し、mongodb から runCommand 構文を使用することです。docs.mongodb.org にあるサンプル コードとデータを次に示します。

SQL クエリの例は次のようになります。

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

mongoDB シェルでは、次のように実行します。

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)

これが機能しない場合はお知らせください。

于 2013-06-16T13:55:02.353 に答える