mongodb c++ 驅(qū)動

資源

github鏈接形葬,官方主頁暮的,本教程來自官方的 安裝教程頁面。更新日期:2018年9月21日

安裝準(zhǔn)備

  • 任何一個標(biāo)準(zhǔn)的 Unix 平臺冻辩,或 Windows 7 SP1+
  • 一個支持 C++11(gcc,clang,or Visual Studio)的編譯器
  • CMaker 3.2 或之后版本
  • boost 頭文件(可選)

安裝

1 安裝最新版本的 MongoDB C driver

mongocxx driver 是構(gòu)建在 MongoDB C driver 之上的猖腕。對于 mongocxx-3.3.x,需要 libmongoc 1.10.1 或之后的版本恨闪。

除非你知道你的包管理工具提供了一個足夠高的版本,否則你應(yīng)該下載源碼然后自己編譯咙咽,可以從 C Driver release 獲得源碼老玛。

根據(jù) Installing libmongoc 的介紹可以從源碼進(jìn)行編譯。

達(dá)到行業(yè)最佳實(shí)踐和一些規(guī)則需要使用到 TLS 1.1 或更新的版本钧敞。如果在 Linux 上安裝了至少為 1.0.1 版本的 OpenSSL,MongoDB C Driver 支持 TLS 1.1.在 macOS 和 Windows 上镜廉,C Driver 使用支持 TLS 1.1 的本地 TLS愚战。

譯者同樣翻譯了 mongoDB c 驅(qū)動,可以在 這里 查看视乐。

2 選擇 C++ 17 增加特性

mongocxx driver 使用到了 C++17 std::optionalstd::string_view特性。為了使用 pre-C++17 編譯 mongocxx driver佑淀,你必須在以下的實(shí)現(xiàn)中選擇一個:

  • MNMLSTC/core(非 Windows 平臺默認(rèn)) 彰檬。使用 -DBSONCXX_POLY_USE_MNMLSTC=1 選項(xiàng)谎砾。

NOTE:這個選項(xiàng)會使在安裝 bsoncxx 庫時同時提供一個 MNMLSTC/core 的僅頭文件安裝包景图。因此會在編譯過程中自動從 GitHub 上下載 MLNMLSTC碉哑。如果你已經(jīng)在你的系統(tǒng)上安裝了一個可用的 MNMLSTC。你可以通過使用 -DBSONCXX_POLY_USE_SYSTEM_MNMLSTC 這個選項(xiàng)避免下載過程妆毕。

  • Boost(Windows 平臺默認(rèn))贮尖。使用 -DBSONCXX_POLY_USE_BOOST=1 選項(xiàng)。如果你使用的是 MSVC薪前,目前這是唯一的選擇关斜。
  • std::experimental。使用 -DBSONCXX_POLY_USE_STD_EXPERIMENTAL=1 選項(xiàng)例诀。如果你的工具鏈標(biāo)準(zhǔn)庫在 std::experimental 命名空間提供了 optionalstring_view 裁着,你可以使用這個選項(xiàng)繁涂。注意你標(biāo)準(zhǔn)庫的 std::experimental的實(shí)現(xiàn)可能會隨時間而改變二驰,進(jìn)而在不可預(yù)期的的情況下破壞二進(jìn)制文件的兼容性。所以這種方式是不推薦也支持這么做的矿酵。

大多數(shù)用戶使用默認(rèn)參數(shù)就行了矗积。然而,如果你已經(jīng)有一個嚴(yán)重依賴上面提到對應(yīng)庫的應(yīng)用辜腺,你可能更愿意使用相同的庫來編譯 mongocxx driver。

如果你想要構(gòu)建一個穩(wěn)定的二進(jìn)制文件接口测砂,不要改變你項(xiàng)目選擇的特性實(shí)現(xiàn)方法百匆。

3 下載最新的 mongocxx driver

從 git 上獲得源碼時,release/stable 分支上追蹤了最新的穩(wěn)定發(fā)行版存璃。例如矩动,下面代碼獲取了一個穩(wěn)定的分支版本:

git clone https://github.com/mongodb/mongo-cxx-driver.git \
    --branch releases/stable --depth 1
cd mongo-cxx-driver/build

如果你更喜歡下載源碼释漆,可以從 mongocxx release 頁面下載一個你喜歡的發(fā)布版本的源碼男图。例如,下面代碼下載了 3.3.1 版本源碼:

curl -OL https://github.com/mongodb/mongo-cxx-driver/archive/r3.3.1.tar.gz
tar -xzf r3.3.1.tar.gz
cd mongo-cxx-driver-r3.3.1/build

請確保你進(jìn)入源碼下的 build 文件夾下栈戳,以便接下來的步驟可以執(zhí)行难裆。

4 配置驅(qū)動

在 Unix 系統(tǒng)中, libmongoc 默認(rèn)安裝到了 /usr/local 下褂痰,你也可以使用下面的 cmake 命令將 mongocxx 也安裝到 /usr/local 目錄下:

注意:結(jié)尾的 .. 不能省略)

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..

/usr/local 可以被替換為我們實(shí)際 libmongoc 安裝的位置症虑。

如果你想將 mongocxx 安裝到一個和 libmongoc 不同的文件夾下谍憔,你必須在 cmake 指令中指定如何找到 libmongoc安裝的文件夾。根據(jù) mongocxx 的版本不同這個步驟也不同:

  • 編譯 mongocxx 3.2.x及以后的版本逛球,應(yīng)該使用 CMAKE_PREFIX_PATH 參數(shù)指定 libmongoc 的安裝文件夾苫昌。例如(請使用你實(shí)際安裝 C driver 的路徑替換 /your/cdriver/prefix,使用你想安裝的路徑替換 /your/cxxdriver/prefix):
cmake -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/your/cxxdriver/prefix \
    -DCMAKE_PREFIX_PATH=/your/cdriver/prefix ..

注意:如果你需要給 CMAKE_PREFIX_PATH 指定多個路徑,請使用英文狀態(tài)下的分號隔開屋厘,例如:

-DCMAKE_PREFIX_PATH="/your/cdriver/prefix;/some/other/path"
  • 編譯 mongocxx 3.1.x 和 3.0.x 的版本應(yīng)該在 cmake 中使用 -DLIBMONGOC_DIR-DLIBBSON_DIR 參數(shù)指定 libmongoc 的安裝路徑汗洒。請看下面的例子,假設(shè) libmongoclibbson 都已經(jīng)安裝在 /your/cdriver/prefix下:
cmake -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/your/cxxdriver/prefix
    -DLIBMONGOC_DIR=/your/cdriver/prefix
    -DLIBBSON_DIR=/your/cdriver/prefix ..

注意:此時根據(jù)需要在 cmake 指定對應(yīng)的參數(shù)來設(shè)置 C++ 17 支持的方式瞻凤。例如世杀,選擇 Boost 支持方式,使用下面的命令替代 cmake 那一行:

cmake -DCMAKE_BUILD_TYPE=Release -DBSONCXX_POLY_USE_BOOST=1 \
    -DCMAKE_INSTALL_PREFIX=/usr/local ..

對于 Windows 平臺蛛壳,下面例子演示了如何配置 MSVC 下的編譯(假設(shè) libmongoc 和 libbson 按照 mongoc Windows installation instructions 教程安裝在 c:\mongo-c-driver且 boost 安裝在 c:\local\boost_1_59_0):

'C:\Program Files (x86)\CMake\bin\cmake.exe' -G "Visual Studio 14 Win64"
    -DCMAKE_INSTALL_PREFIX=C:\mongo-cxx-driver
    -DCMAKE_PREFIX_PATH=c:\mongo-c-driver
    -DBOOST_ROOT=c:\local\boost_1_59_0 ..

我根據(jù)我的另一篇 libmongoc 的譯文將其安裝到我指定的目錄中了衙荐,所以我這里的命令對應(yīng)為:

cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=D:\software4\mongo_c_driver\cppinstall_release -DCMAKE_PREFIX_PATH=D:\software4\mongo_c_driver\install -DBOOST_ROOT=D:\software3\boost_1_67_0 ..

mongocxx 默認(rèn)以共享庫的形式進(jìn)行編譯浮创,同時這也是推薦初學(xué)者的編譯形式。

注意:對于 mongocxx 3.2.x 和更新版本的用戶溜族,一些高級用戶可能想編譯靜態(tài)庫垦沉,如果需要的話,在 CMake 中指定 -DBUILD_SHARED_LIBS=OFF摧玫。該參數(shù)將會編譯出 libmongoc 的靜態(tài)庫绑青。在一個應(yīng)用中同時鏈接共享 libmongoc 和 靜態(tài) mongocxx 是不支持的闸婴,同樣同時鏈接靜態(tài) libmongoc 和共享 mongocxx也不行。

5 編譯和安裝驅(qū)動

如果你使用默認(rèn)的 MNMLSTC 的C++17支持且安裝在一個需要 root 權(quán)限的文件夾下降狠。你應(yīng)該在使用 make 之前首先通過 sudo 安裝 MNMLSTC,否則你應(yīng)該使用 sudo 運(yùn)行所有的 make

# Only for MNMLSTC polyfill
sudo make EP_mnmlstc_core

一旦你 MNMLSTC 安裝完畢否纬,或者你使用了其他的 C++17支持方式蛋褥,你可以使用下面命令進(jìn)行編譯安裝:

make && sudo make install

在 Windows 平臺下,你可以使用以下的命令進(jìn)行編譯和安裝:

msbuild.exe ALL_BUILD.vcxproj
msbuild.exe INSTALL.vcxproj

當(dāng)然 CMake 執(zhí)行完畢之后就會生成對應(yīng)的 VS 項(xiàng)目文件膜廊,直接使用 VS 打開對應(yīng)的 .sln 文件編譯文件也可以淫茵。這一點(diǎn)和編譯安裝 libmongoc 相同匙瘪。

6 測試你的安裝文件

保存下面的源碼到任意的目錄下同時命名為 test.cpp

#include <iostream>

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

#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>

int main(int, char**) {
    mongocxx::instance inst{};
    mongocxx::client conn{mongocxx::uri{}};

    bsoncxx::builder::stream::document document{};

    auto collection = conn["testdb"]["testcollection"];
    document << "hello" << "world";

    collection.insert_one(document.view());
    auto cursor = collection.find({});

    for (auto&& doc : cursor) {
        std::cout << bsoncxx::to_json(doc) << std::endl;
    }
}

借助 CMake 進(jìn)行編譯

如果你使用 CMake 管理你的項(xiàng)目,你可以使用 find_package() 指令來使能 mongocxx 的編譯鏈接算灸。find_package()指令會設(shè)置當(dāng)前環(huán)境中需要被傳遞到你的編譯目標(biāo)的相關(guān)變量(例如:LIBMONGOCXX_INCLUDE_DIRS, LIBMONGOCXX_LIBRARIES驻啤,等等)荐吵。如果你將 mongocxxlibmongoc安裝到了一個非標(biāo)準(zhǔn)位置(不在環(huán)境變量中)先煎,你需要在運(yùn)行 cmake時將 CMAKE_PREFIX_PATH 設(shè)置為庫安裝的位置(在上面編譯時使用 CMAKE_INSTALL_PREFIX指定的參數(shù))。

mongocxx 源倉庫(3.2.x或更新版本)中遥倦,examples/projects/mongocxx/cmake 文件夾下有使用共享庫方式鏈接 mongocxx 的 CMake 測試應(yīng)用占锯,以及使用靜態(tài)庫的鏈接的 CMake 測試應(yīng)用。

譯者這里參考了官方的 CMakeLists.txt 編寫的 CMakeLists.txt 如下:

cmake_minimum_required(VERSION 3.11)
PROJECT (MONGOTEST)
# SET (SRC_LIST test.cpp)
find_package(libmongocxx REQUIRED)
add_executable(test test.cpp)
find_package(Boost REQUIRED)
target_include_directories(test
  PRIVATE ${Boost_INCLUDE_DIRS}
)
target_include_directories(test
  PRIVATE ${LIBMONGOCXX_INCLUDE_DIRS}
)
target_link_libraries(test
  PRIVATE ${LIBMONGOCXX_LIBRARIES}
)
target_compile_definitions(test
  PRIVATE ${LIBMONGOCXX_DEFINITIONS}
)

參考官方的 build.sh 編寫命令行參數(shù)如下:

cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_PREFIX_PATH=D:\software4\mongo_c_driver\cppinstall_release -DBOOST_ROOT=D:\software3\boost_1_67_0 ..

需要注意以下幾點(diǎn):

  • 譯者這里編譯的是共享庫
  • 在運(yùn)行程序之前需要將 c 和 cpp 驅(qū)動的 dll 文件路徑添加到環(huán)境變量中堡称。譯者這里添加的是 D:\software4\mongo_c_driver\cppinstall_release\binD:\software4\mongo_c_driver\install\bin

借助 pkg-config 編譯

使用下面的命令編譯上面的測試代碼:

c++ --std=c++11 test.cpp -o test $(pkg-config --cflags --libs libmongocxx)

使用靜態(tài)庫的高級用戶必須使用 libmongocxx-static 參數(shù)替代上面 pkg-configlibmongocxx 參數(shù)(這需要 mongocxx 3.2.x 或更新的版本)却紧。

如果你安裝的位置不在 pkg-config 的搜索路徑上,應(yīng)該首先設(shè)置 PKG_CONFIG_PATH 環(huán)境變量断凶。

export PKG_CONFIG_PATH="$MY_INSTALL_PREFIX/lib/pkgconfig"

不使用 pkg-config 和 CMake 編譯

如果你即不使用 CMake 也沒有可用的 pkg-config挺物,你必須在命令行或 IDE 中手動的指定包含路徑和庫路徑。

下面是上面一個命令行的一個擴(kuò)展示例砚著,假設(shè) mongocxx 和 libmongoc 安裝在 /usr/local

c++ --std=c++11 test.cpp -o test \
    -I/usr/local/include/mongocxx/v_noabi \
    -I/usr/local/include/bsoncxx/v_noabi \
    -L/usr/local/lib -lmongocxx -lbsoncxx

對于高級用戶:下面是使用靜態(tài)庫的擴(kuò)展示例痴昧。注意預(yù)處理器定義的 MONGOCXX_STATICBSONCXX_STATIC 必須被定義在所有包括 mongocxx 頭文件的源文件中赶撰。否則將會出現(xiàn)難以診斷的鏈接錯誤。

c++ --std=c++11 test.cpp -o test \
    -DMONGOCXX_STATIC -DBSONCXX_STATIC -DMONGOC_STATIC -DBSON_STATIC \
    -I/usr/local/include/libmongoc-1.0 \
    -I/usr/local/include/libbson-1.0 \
    -I/usr/local/include/mongocxx/v_noabi \
    -I/usr/local/include/bsoncxx/v_noabi \
    -L/usr/local/lib -lmongocxx-static -lbsoncxx-static
    -lmongoc-static-1.0 -lsasl2 -lssl -lcrypto -lbson-static-1.0 -lm -lpthread

使用 MSVC 編譯

為了在 MSVC 上編譯(VS)餐胀,你必須在項(xiàng)目中設(shè)置需要的包含路徑瘤载、庫路徑、預(yù)定義和鏈接庫墨技。這些操作可以在 VS 中借助 UI 實(shí)現(xiàn)也可以直接編輯 XML 格式的 .vcxproj 文件實(shí)現(xiàn)挎狸。為了確保你每一步都設(shè)置正確,下面PropertyGroupItemDefinitionGroup的設(shè)置示例展示了 Debug x64 編譯的設(shè)置方法崭别。

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <LinkIncremental>true</LinkIncremental>
    <IncludePath>c:\local\boost_1_59_0\;C:\mongo-cxx-driver\include\mongocxx\v_noabi;C:\mongo-cxx-driver\include\bsoncxx\v_noabi;C:\mongo-c-driver\include\libmongoc-1.0;C:\mongo-c-driver\include\libbson-1.0;$(IncludePath)</IncludePath>
    <LibraryPath>c:\mongo-c-driver\lib\;c:\mongo-cxx-driver\lib\;$(LibraryPath)</LibraryPath>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <ClCompile>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>Disabled</Optimization>
      <PreprocessorDefinitions>MONGOCXX_STATIC;BSONCXX_STATIC;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <SDLCheck>true</SDLCheck>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <AdditionalDependencies>libmongocxx.lib;libbsoncxx.lib;mongoc-static-1.0.lib;bson-1.0.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市侥蒙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌学搜,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聚磺,死亡現(xiàn)場離奇詭異炬丸,居然都是意外死亡稠炬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門暮屡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毅桃,“玉大人,你說我怎么就攤上這事莺掠《林妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵掖棉,是天一觀的道長膀估。 經(jīng)常有香客問我察纯,道長针肥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任具则,我火速辦了婚禮具帮,結(jié)果婚禮上低斋,老公的妹妹穿的比我還像新娘膊畴。我一直安慰自己病游,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布买猖。 她就那樣靜靜地躺著滋尉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奸远。 梳的紋絲不亂的頭發(fā)上讽挟,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天耽梅,我揣著相機(jī)與錄音,去河邊找鬼诅迷。 笑死众旗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滩租。 我是一名探鬼主播利朵,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼技即!你這毒婦竟也來了樟遣?” 一聲冷哼從身側(cè)響起郭脂,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤展鸡,失蹤者是張志新(化名)和其女友劉穎埃难,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忍弛,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡细疚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年川梅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吧彪。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡姨裸,死狀恐怖怨酝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赡艰,我是刑警寧澤盛险,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布勋又,位于F島的核電站,受9級特大地震影響鹤啡,放射性物質(zhì)發(fā)生泄漏蹲嚣。R本人自食惡果不足惜祟牲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一说贝、第九天 我趴在偏房一處隱蔽的房頂上張望慎颗。 院中可真熱鬧,春花似錦傲宜、人聲如沸夫啊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熊榛。三九已至,卻和暖如春跷叉,著一層夾襖步出監(jiān)牢的瞬間营搅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工园欣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留休蟹,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像盈魁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赤套,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容