首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rmongodb中的Group by

rmongodb中的Group by
EN

Stack Overflow用户
提问于 2012-11-28 06:56:06
回答 1查看 709关注 0票数 2

我正在尝试在一个MongoDB集合上创建一个组查询,类似于:

代码语言:javascript
复制
db.orders.group( {
    key: { ord_dt: 1, 'item.sku': 1 },
    cond: { ord_dt: { $gt: new Date( '01/01/2012' ) } },
    reduce: function ( curr, result ) { },
    initial: { }
} )

我使用的是rmongodb。通过查看rmongodb包文档,他们使用mongo.command来运行计数命令:

代码语言:javascript
复制
mongo <- mongo.create() 
if (mongo.is.connected(mongo)) {
    buf <- mongo.bson.buffer.create() 
    mongo.bson.buffer.append(buf, "count", "people") 
    mongo.bson.buffer.append(buf, "query", mongo.bson.empty()) 
    command <- mongo.bson.from.buffer(buf) 
    result = mongo.command(mongo, "test", command) 
    if (!is.null(result)) {  
        iter = mongo.bson.find(result, "n") print(mongo.bson.iterator.value(iter)) 
    }
}

同样与众不同的是:

代码语言:javascript
复制
mongo.distinct <- function(mongo, db, collection, key) {    
    b <- mongo.command(mongo, db, list(distinct=collection, key=key))    
    if(!is.null(b))
        b <- mongo.bson.value(b, "values")
    }
names <- mongo.distinct(mongo, "test", "people", "name")

有没有人成功地使用mongo.command进行了分组查询?

EN

回答 1

Stack Overflow用户

发布于 2013-07-12 21:41:33

下面是一个使用聚合框架的简单"GROUP BY语句“的基本示例。请注意,这需要MongoDB 2.1或更高版本:http://docs.mongodb.org/manual/core/aggregation/

首先建立连接和一些虚拟数据:

代码语言:javascript
复制
library(rmongodb)
mongo <- mongo.create()

db <- "stackoverflow"
coll <- "grpmong"
ns <- paste(db, coll, sep = ".")

mongo.insert(mongo, ns, mongo.bson.from.list(list(y=1, x=1)))
mongo.insert(mongo, ns, mongo.bson.from.list(list(y=1, x=2)))
mongo.insert(mongo, ns, mongo.bson.from.list(list(y=2, x=3)))
mongo.insert(mongo, ns, mongo.bson.from.list(list(y=2, x=4)))

检查数据的格式:

代码语言:javascript
复制
 >mongo.find.one(mongo, ns, mongo.bson.empty())
    _id : 7          51e002b881620de5fe2973ec
    y : 1    1.000000
    x : 1    1.000000

以下代码将生成与以下内容等效的代码:

代码语言:javascript
复制
SELECT y '_id', SUM(x) total
FROM grpmong
GROUP BY y

创建"GROUP BY语句“

代码语言:javascript
复制
x <- list('$group' = list('_id' = '$y',
                          'total' = list('$sum' = '$x')
                          ))
grpBSON <- mongo.bson.from.list(x) 

创建聚合管道,并在其中添加"GROUP BY语句“:

代码语言:javascript
复制
buf <- mongo.bson.buffer.create();
mongo.bson.buffer.append(buf, "aggregate", coll); 
  mongo.bson.buffer.start.array(buf, "pipeline");
    mongo.bson.buffer.append(buf, "0", grpBSON);
  mongo.bson.buffer.finish.object(buf);
cmd <- mongo.bson.from.buffer(buf);

运行以下命令:

代码语言:javascript
复制
res <- mongo.command(mongo, db, cmd)

检查结果:

代码语言:javascript
复制
> print(res)
result : 4
  0 : 3
    _id : 1 2.000000
    total : 1 7.000000
  1 : 3
    _id : 1 1.000000
    total : 1 3.000000
  ok : 1 1.000000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13594714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档