2016-12-04 3 views
1

MongoDBのC++ 11ドライバ(バージョン3.1.0-rc0)を試している間、次のコードの出力が私を混乱させました。mongo-cxxドライバがjsonに二倍

#include <iostream> 

#include <bsoncxx/builder/stream/document.hpp> 
#include <bsoncxx/json.hpp> 

int main() { 
    bsoncxx::builder::stream::document s; 
    s << "x" << 1.0; 

    std::cout << bsoncxx::to_json(s) << std::endl; 

    return 0; 
} 

出力:

{ "x" : 1 } 
  1. これは正常な動作ですか?
  2. JSONでBSONの倍数が浮動小数点数として表されるようにするにはどうすればよいですか?

構成: CentOSの7、GCC 6.2.0、モンゴ-C-ドライバ1.5.0、モンゴ-CXX-ドライバ3.1.0-RC0

+0

どのプラットフォーム/アーキテクチャ/コンパイラを使用していますか?あなたはどのバージョンのlibbsonを持っていますか? – xdg

+0

あなたのコードを実行すると、 '{" x ":1、" y ":0.999999、" z ":0.9999999}'がすべて1行に表示されます。 (ダーウィンの3.1.0-rc0とlibbson 1.5.0) – xdg

+0

あなたはそうだと思います。私は私の質問を更新しました。ところで、私は明示的にlibbsonをインストールしなかった、私はそれがmongo-cドライバと一緒に来たと思う。 – gncs

答えて

2

その動作がlibbsonに固有のものであるように見えますこれはJSONのシリアル化を提供します。 Javascriptでは数値型は区別されないため、技術的には正解ですが、たとえ0であっても小数点以下を保持する方法を理解しています。

したがって、質問に対する回答は

  1. 予想外ですが、驚くべきことではありません。
  2. 現時点では、あなたはmongocxxからそれを行うことはできません。 BSON構造を反復し、別のJSONライブラリを使用してJSONドキュメントを構築することができます。

私はlibbsonの管理者にもこの問題を取り上げます。 (更新:提出されたチケットCDRIVER-1945)。

+0

ありがとう!この値をもう一度読むと、整数への変換は問題になりますが、それはまだ二倍になると思います。だから私はこの行動が問題になると思うのです。 – gncs

+0

一般的に、消費者/生産者が同じことをやっている/期待していない限り、同じタイプのJSON値に頼ることはできません。 MongoDBはJSONの読み書き時に型情報を保持するために["extended JSON"](https://docs.mongodb.com/manual/reference/mongodb-extended-json/)を作成しました。 bsoncxxライブラリーはそれをまだ提供していませんが、2017年にはいつかになります。他の言語ドライバーのいくつかは既に行います。 – xdg

+0

double型の数値をその値に応じて整数に変換すると、それでも矛盾していると思います。 '1.000000000000001'をJSONに変換して後でデータベースに保存すると、二重になると思います。 – gncs

関連する問題