0

オンラインで掘り下げた後、BSON が匿名オブジェクトの配列をサポートしているかどうかを判断できませんでした。これが必要な理由は、次のスキーマを持つロギング システムのためです。

{
  ERROR_LOG: [
    {
      message: "There was an error recording the file",
      code: 1133
    },
    {
      message: "There was an error saving the file",
      code: 1135 
    }
  ],
  FILE_LOG: [
    {
      message: "File 1234.txt edited",
      code: 5445
    },
    {
      message: "File transfer success",
      code: 2332
    }
  ], 
  ... etc.
}

このスキーマ設計は効率的ではない可能性があります。匿名オブジェクトがサポートされていない場合は、さまざまなスキーマの提案を受け入れます。

4

1 に答える 1

1

します。

ボンネットの下では、ドキュメントは「0」、「1」などのインクリメントされた名前を取得しますが、bson ライブラリはそれを隠します。

配列内の要素の場合、型を混在させることもできます。

{
    array: [
        {
            message: "There was an error recording the file",
            code: 1133
        },
        1234,
        "etc."
    ]
}

編集:

ここのドキュメントからの引用: http://api.mongodb.org/c/current/tutorial.html#bson

次のようなことができるはずだと思います:

bson doc[1];

bson_init( doc );
    bson_append_start_array( b, "ERROR_LOG" );
      bson_append_start_object( doc, "0" );
        bson_append_string( doc, "message", "There was an error recording the file" );
        bson_append_int( doc, "code", 1133 );
      bson_append_finish_object( doc );
      bson_append_start_object( doc, "1" );
        bson_append_string( doc, "message", "There was an error saving the file" );
        bson_append_int( doc, "code", 1135 );
      bson_append_finish_object( doc );
    bson_append_finish_array( b );
    bson_append_start_array( b, "FILE_LOG" );
      bson_append_start_object( doc, "1" );
        bson_append_string( doc, "message", "File 1234.txt edited" );
        bson_append_int( doc, "code", 5445 );
      bson_append_finish_object( doc );
      bson_append_start_object( doc, "1" );
        bson_append_string( doc, "message", "File transfer success" );
        bson_append_int( doc, "code", 2332 );
      bson_append_finish_object( doc );
    bson_append_finish_array( b );
bson_finish( doc );

C ドライバーは私をうそつきにしたので、配列要素の「インデックス」名を追跡する必要があることに注意してください。

于 2013-06-10T20:38:59.040 に答える