2

私はデータを持っています。その例をお見せしましょう

1 1 2 2 2 3

そして、Group by を使用して各値の数を取得したいと思います。結果は以下のようになります

値 | カウント 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 を使用していくつかのコードを作成しようとしました..しかし、失敗しました..

どうすればいいですか?

4

1 に答える 1

0

私のマシンのポート 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})

サンプルデータごと。最新のドライバーを使って、以下のサンプルコードを書きました。

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

モンゴシェルで。

于 2012-11-22T18:18:07.567 に答える