我正在尝试从r
mongodb访问
mongodb聚合框架.它应该可以通过mongo.command()获得,但我无法正确使用bson.
这是一个可复制的例子.在R中,设置一个测试集合:
mongo <- mongo.create()
db <- "test"
ns <- "test.people"
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.append(buf, "name", "John")
mongo.bson.buffer.append(buf, "age", 22L)
b <- mongo.bson.from.buffer(buf)
mongo.insert(mongo, ns, b);
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.append(buf, "name", "John")
mongo.bson.buffer.append(buf, "age", 35L)
b <- mongo.bson.from.buffer(buf)
mongo.insert(mongo, ns, b);
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.append(buf, "name", "Fred")
mongo.bson.buffer.append(buf, "age", 27L)
b <- mongo.bson.from.buffer(buf)
mongo.insert(mongo, ns, b);
Now, on the mongo console, the following works:
use test
db.runCommand({
aggregate : "people", pipeline : [
{ $group :
{ _id : '$name',
total : { $sum : 1 } } } ]
})
看起来R中的以下内容会达到同样的效果:
mongo.command(mongo, "test", list(
aggregate="people",
pipeline=list(
group=list(
"_id"="$name",
total=list("$sum"=1)
)
)
))
这不起作用.
对于这个特定的聚合,我知道还有其他方法可以做到这一点.我只是提供它作为一个简单的例子,但我希望将来能够进行更复杂的聚合.
另外,我知道mongodb的另一个R包我可能会考虑做这个技巧,但我现在非常投入使用这个包.
最佳答案 首先,以下代码将为您提供所需的结果:
sub.buf <- mongo.bson.buffer.create();
mongo.bson.buffer.start.object(sub.buf, "$group");
mongo.bson.buffer.append(sub.buf, "_id", "$name");
mongo.bson.buffer.start.object(sub.buf, "total");
mongo.bson.buffer.append(sub.buf, "$sum", 1L);
mongo.bson.buffer.finish.object(sub.buf);
mongo.bson.buffer.finish.object(sub.buf);
sb <- mongo.bson.from.buffer(sub.buf);
buf <- mongo.bson.buffer.create();
mongo.bson.buffer.append(buf, "aggregate", "people");
mongo.bson.buffer.start.array(buf, "pipeline");
mongo.bson.buffer.append(buf, "0", sb);
mongo.bson.buffer.finish.object(buf);
cmd <- mongo.bson.from.buffer(buf);
我发现在rmongodb中执行聚合的挑战是用户:
>几乎需要使用bson缓冲区
>需要将管道参数指定为数组
>必须用整数标记管道数组中的条目
(我认为这需要将实际的聚合机制指定为子bson对象)
我可能错了(3),虽然我没有看到任何关于如何执行“组”聚合的任何其他例子,这会使语句折扣.
祝你好运!