それほど簡単ではありませんが、できます:-)。最も難しいのは、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)
これが機能しない場合はお知らせください。