2016-12-04 41 views
1

在試用MongoDB的C++ 11驅動程序(版本3.1.0-rc0)時,以下代碼的輸出讓我感到困惑。mongo-cxx-driver雙打到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. 如何確保BSON雙打在JSON中表示爲浮點數?

配置: 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}。 (達爾文的3.1.0-rc0和libbson 1.5.0) – xdg

+0

你說得對 - 我應該提到這一點。我更新了我的問題。順便說一句,我沒有明確安裝libbson,我認爲它帶有mongo-c-driver。 – gncs

回答

2

它看起來像行爲是固有的libbson ,它提供了JSON序列化。這在技術上是正確的,因爲Javascript不區分數字類型,但我知道如何保持小數分量,即使爲0.

所以目前,您的問題的答案是

  1. 沒有預料到,但並不奇怪。
  2. 目前,你不能從mongocxx那樣做。您可以迭代BSON結構並使用另一個JSON庫構造JSON文檔。

我會接受libbson維護者的問題。 (更新:提交票CDRIVER-1945)。

+0

謝謝!再次讀取該值時,轉換爲整數會成爲問題,並且您希望它仍然是雙倍值。這就是爲什麼我認爲這種行爲可能有問題。 – gncs

+0

一般來說,除非你絕對確定消費者/生產者正在做/期待着同樣的事情,否則你不能依賴於具有相同類型的JSON值。 MongoDB在讀/寫JSON時創建了[「擴展JSON」](https://docs.mongodb.com/manual/reference/mongodb-extended-json/)來保存類型信息。 bsoncxx庫尚未提供,但將在2017年的某個時間。其他一些語言驅動程序已經有。 – xdg

+0

我仍然認爲這是不一致的,如果一個數字是一個double被轉換爲一個整數取決於它的值。當我將'1.000000000000001'轉換爲JSON並稍後將其保存到數據庫時,我預計它會是雙倍的,不是嗎? – gncs