Сгруппировать по rmongodb

Я пытаюсь создать групповой запрос в коллекции MongoDB, похожий на:

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 для запуска команды count:

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)) 
    }
}

также различаются:

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 для группового запроса?


person user1858082    schedule 27.11.2012    source источник


Ответы (1)


Вот базовый пример простого оператора GROUP BY, использующего структуру агрегации. Обратите внимание, что для этого требуется MongoDB версии 2.1 или более поздней: http://docs.mongodb.org/manual/core/aggregation/

Сначала создайте соединение и некоторые фиктивные данные:

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)))

Проверьте формат данных:

 >mongo.find.one(mongo, ns, mongo.bson.empty())
    _id : 7          51e002b881620de5fe2973ec
    y : 1    1.000000
    x : 1    1.000000

Следующее будет производить эквивалент:

SELECT y '_id', SUM(x) total
FROM grpmong
GROUP BY y

Создайте «оператор GROUP BY»

x <- list('$group' = list('_id' = '$y',
                          'total' = list('$sum' = '$x')
                          ))
grpBSON <- mongo.bson.from.list(x) 

Создайте конвейер агрегации и добавьте в него «оператор GROUP BY»:

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);

Запустите команду:

res <- mongo.command(mongo, db, cmd)

Проверьте результат:

> 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
person Community    schedule 12.07.2013