如何访问MongoDB';来自rmongodb R包的s聚合框架

如何访问MongoDB';来自rmongodb R包的s聚合框架,r,mongodb,R,Mongodb,我正在尝试从rmongodb访问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.bso

我正在尝试从rmongodb访问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 } } } ]
})
这是行不通的

对于这个特定的聚合,我知道还有其他方法可以做到这一点。我只是提供了一个简单的例子,但我想在将来讨论更复杂的聚合


另外,我还知道mongodb的另一个R包,我可能可以研究它来实现这一点,但我现在投入了大量资金来使用这个包。

您的代码看起来将生成名为
“group”
的聚合管道,并且没有这样的管道操作符。操作员是
“$group”
,这可能是唯一需要更正的问题

但是,我怀疑使用list()只包含一个“元素”会创建一个子文档,而不是创建一个包含一个文档的数组,这正是管道的本意。您可以尝试使用单个元素显式创建数组,特别是如果这是在对象中正确获取“$group”的唯一方法

... 
mongo.bson.buffer.start.array(buf, "pipeline") 
mongo.bson.buffer.append(buf, "$group", ... etc 
mongo.bson.buffer.finish.object(buf)

首先,以下代码将为您提供所需的结果:

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);
sub.buf
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);