C API 上的 mongodb 分组

标签 mongodb group-by database

我有一个数据。让我给你举个例子

1 1个 2个 2个 2个 3

而且,我想使用分组依据获取每个值的数量。结果将如下所示

值(value) |数数 1 | 2个 2 | 3个 3 | 1

也许,Mongo Shell上的group by查询是这样的

db.collection.group(
{ key : {value:true},
reduce: function(obj, prev) { prev.csum += 1; },
initial: { csum: 0 }
})

但是,我必须使用 mongoDB C API 将该查询转换为 C 代码。 我试图像那样使用 bson_append_bson 编写一些代码..但是,失败了..

我该怎么办?

最佳答案

我在我的机器上的端口 12345 上设置了一个 Mongo 2.2.1 实例。我创建了一个 test.data 集合并用

填充它
use test
db.data.insert({value:1})
db.data.insert({value:1})
db.data.insert({value:2})
db.data.insert({value:2})
db.data.insert({value:2})
db.data.insert({value:3})

根据您的示例数据。使用 latest driver ,我写了下面的示例代码。

#include <stdio.h>
#include <mongo.h>

int main( char *argv[] ) {
    bson b, out;
    mongo conn;

    if( mongo_connect( &conn, "127.0.0.1", 12345 ) != MONGO_OK ) {
        switch( conn.err ) {
            case MONGO_CONN_NO_SOCKET:
                printf( "FAIL: Could not create a socket!\n" );
                break;
            case MONGO_CONN_FAIL:
                printf( "FAIL: Could not connect to mongod. Make sure it's listening at 127.0.0.1:27017.\n" );
                break;
            }

        exit( 1 );
    }

    bson_init( &b );
        bson_append_string( &b, "aggregate", "data" );
        bson_append_start_array( &b, "pipeline" );
            bson_append_start_object( &b, "0" );
                bson_append_start_object( &b, "$group" );
                    bson_append_string( &b, "_id", "$value" );
                    bson_append_start_object( &b, "count" );
                        bson_append_int( &b, "$sum", 1 );
                    bson_append_finish_object( &b );
                bson_append_finish_object( &b );
            bson_append_finish_object( &b );
        bson_append_finish_array( &b );
    bson_finish( &b );
    bson_print( &b );

    printf( "command result code: %d\n", mongo_run_command( &conn, "test", &b, &out ) );
    bson_print( &out );

    bson_destroy( &b );
    bson_destroy( &out );
    mongo_destroy( &conn );
    return( 0 );
}

而不是 $group命令,它在分片环境中不起作用,我使用了 Aggregation Framework (自 2.1 以来的新功能)。上面的 C 代码等同于

use test
db.data.aggregate({$group:{_id:"$value",count:{$sum:1}}})

在 Mongo shell 中。

关于C API 上的 mongodb 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13508495/

相关文章:

mysql - 有任何 SQL GROUP_CONCAT 替代函数吗?

MySQL - 如何使用列约束声明主键?

python - 使用 pyodbc 连接到数据库 - 不起作用

mongodb - 删除 mongo shell 上的文档

javascript - Mongoose & 获取集合中的平均评分?

javascript - 如何在 MeteorJS 中更新 MongoDB 集合上的子文档数组

python - 使用Flask,尝试让AJAX在更新mongo记录后更新span,但它打开一个新页面

r - 如何通过group_by中的group-number编号/标记数据表?

sql - 计算字段中唯一值的实例

database - 防止 KDB+ 数据库因中止错误而死亡