0

我知道可以在 MongoDB 命令行中使用 group 方法,但是我在 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 shell 中,您将运行类似这样的东西。

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 回答