纯情太子妖艳妃 發表於 2020-7-5 21:33:00

MongoDB C驱动程序(libmongoc)(libbson)

<p>最近用到MongoDB C驱动程序,网上资料较少,所以记录分享。</p>
<p><strong>一、简介</strong></p>
<p>  MongoDB C驱动程序(也称为“ libmongoc”)是一个库,用于C程序中操作MongoDB。</p>
<p>  官方下载地址:http://mongoc.org/</p>
<p>  百度云分享:https://pan.baidu.com/s/1pqRje3zrh-mnEiMGr-ERlg&nbsp;&nbsp;提取码:y5t1</p>
<p>  libmongoc库:https://pan.baidu.com/s/16DF1qpxCTyp2oQmicjtiOw&nbsp;提取码:z4yn</p>
<p>  libbson库:https://pan.baidu.com/s/1di14LTcLTT_T2ta_e21lUg&nbsp;提取码:f8o3</p>
<p><strong>二、使用</strong></p>
<p>  1、安装并运行MongoDB</p>
<div class="cnblogs_code">
<pre>$ mongo --host localhost --port <span style="color: rgba(128, 0, 128, 1)">27017</span><span style="color: rgba(0, 0, 0, 1)">
MongoDB shell version: </span><span style="color: rgba(128, 0, 128, 1)">3.0</span>.<span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">
connecting to: localhost:</span><span style="color: rgba(128, 0, 128, 1)">27017</span>/<span style="color: rgba(0, 0, 0, 1)">test
</span>&gt;</pre>
</div>
<p>  2、C程序中包含libmongoc</p>
<div class="cnblogs_code">
<pre>#include &lt;mongoc/mongoc.h&gt;<span style="color: rgba(0, 0, 0, 1)">
#include </span>&lt;bson/bson.h&gt;</pre>
</div>
<p>  如果您不使用CMake或pkg-config,则可以手动管理路径和库。</p>
<div class="cnblogs_code">
<pre>$ gcc -<span style="color: rgba(0, 0, 0, 1)">o hello_mongoc hello_mongoc.c \
    </span>-I/usr/local/include/libbson-<span style="color: rgba(128, 0, 128, 1)">1.0</span> -I/usr/local/include/libmongoc-<span style="color: rgba(128, 0, 128, 1)">1.0</span><span style="color: rgba(0, 0, 0, 1)"> \
    </span>-lmongoc-<span style="color: rgba(128, 0, 128, 1)">1.0</span> -lbson-<span style="color: rgba(128, 0, 128, 1)">1.0</span><span style="color: rgba(0, 0, 0, 1)">
$ .</span>/<span style="color: rgba(0, 0, 0, 1)">hello_mongoc
{ </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ok</span><span style="color: rgba(128, 0, 0, 1)">"</span> : <span style="color: rgba(128, 0, 128, 1)">1.000000</span> }</pre>
</div>
<p>  3、建立连接</p>
<div class="cnblogs_code">
<pre>#include &lt;mongoc/mongoc.h&gt;

<span style="color: rgba(0, 0, 255, 1)">int</span> main(<span style="color: rgba(0, 0, 255, 1)">int</span> argc, <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">argv[])
{
   </span><span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *uri_string = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">mongodb://localhost:27017</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
   mongoc_uri_t </span>*<span style="color: rgba(0, 0, 0, 1)">uri;
   mongoc_client_t </span>*<span style="color: rgba(0, 0, 0, 1)">client;
   mongoc_database_t </span>*<span style="color: rgba(0, 0, 0, 1)">database;
   mongoc_collection_t </span>*<span style="color: rgba(0, 0, 0, 1)">collection;
   bson_t </span>*command, reply, *<span style="color: rgba(0, 0, 0, 1)">insert;
   bson_error_t error;
   </span><span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">str;
   </span><span style="color: rgba(0, 0, 255, 1)">bool</span><span style="color: rgba(0, 0, 0, 1)"> retval;

   </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    * Required to initialize libmongoc's internals
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
   mongoc_init ();

   </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    * Optionally get MongoDB URI from command line
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
   <span style="color: rgba(0, 0, 255, 1)">if</span> (argc &gt; <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">) {
      uri_string </span>= argv[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">];
   }

   </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    * Safely create a MongoDB URI object from the given string
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
   uri </span>= mongoc_uri_new_with_error (uri_string, &amp;<span style="color: rgba(0, 0, 0, 1)">error);
   </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">uri) {
      fprintf (stderr,
               </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">failed to parse URI: %s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span>
               <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">error message:       %s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
               uri_string,
               error.message);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> EXIT_FAILURE;
   }

   </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    * Create a new client instance
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
   client </span>=<span style="color: rgba(0, 0, 0, 1)"> mongoc_client_new_from_uri (uri);
   </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">client) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> EXIT_FAILURE;
   }

   </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    * Register the application name so we can track it in the profile logs
    * on the server. This can also be done from the URI (see other examples).
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
   mongoc_client_set_appname (client, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">connect-example</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

   </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    * Get a handle on the database "db_name" and collection "coll_name"
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
   database </span>= mongoc_client_get_database (client, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">db_name</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
   collection </span>= mongoc_client_get_collection (client, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">db_name</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">coll_name</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

   </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    * Do work. This example pings the database, prints the result as JSON and
    * performs an insert
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
   command </span>= BCON_NEW (<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ping</span><span style="color: rgba(128, 0, 0, 1)">"</span>, BCON_INT32 (<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">));

   retval </span>=<span style="color: rgba(0, 0, 0, 1)"> mongoc_client_command_simple (
      client, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">"</span>, command, NULL, &amp;reply, &amp;<span style="color: rgba(0, 0, 0, 1)">error);

   </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">retval) {
      fprintf (stderr, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, error.message);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> EXIT_FAILURE;
   }

   str </span>= bson_as_json (&amp;<span style="color: rgba(0, 0, 0, 1)">reply, NULL);
   printf (</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, str);

   insert </span>= BCON_NEW (<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hello</span><span style="color: rgba(128, 0, 0, 1)">"</span>, BCON_UTF8 (<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">world</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));

   </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!mongoc_collection_insert_one (collection, insert, NULL, NULL, &amp;<span style="color: rgba(0, 0, 0, 1)">error)) {
      fprintf (stderr, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, error.message);
   }

   bson_destroy (insert);
   bson_destroy (</span>&amp;<span style="color: rgba(0, 0, 0, 1)">reply);
   bson_destroy (command);
   bson_free (str);

   </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    * Release our handles and clean up libmongoc
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
   mongoc_collection_destroy (collection);
   mongoc_database_destroy (database);
   mongoc_uri_destroy (uri);
   mongoc_client_destroy (client);
   mongoc_cleanup ();

   </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> EXIT_SUCCESS;
}</span></pre>
</div>
<p><strong>三、常用接口</strong></p>
<p>  1、mongoc_collection_t *&nbsp; &nbsp;<span class="nf">mongoc_client_new <span class="p">(<span class="k">const <span class="kt">char <span class="o">*<span class="n">uri_string<span class="p">);</span></span></span></span></span></span></span></p>
<p>  <span><span>使用提供的URI字符串</span><span>创建一个新的</span></span><span class="doc"><span><span>mongoc_client_t</span></span></span><span><span>。</span></span></p>
<p>  参数<br>    uri_string:包含MongoDB连接URI的字符串。<br>  返回<br>    如果URI成功解析,则为新分配的mongoc_client_t,否则为NULL。</p>
<p>  2、<span class="n">mongoc_collection_t <span class="o">*&nbsp; &nbsp;</span></span><span class="n"><span class="o"><span class="nf">mongoc_client_get_collection <span class="p">(<span class="n">mongoc_client_t <span class="o">*<span class="n">client<span class="p">,</span></span></span></span></span></span></span></span><em id="__mceDel"><span class="n"><span class="o"><span class="nf"><span class="p"><span class="n"><span class="o"><span class="n"><span class="p"><span class="k">const <span class="kt">char <span class="o">*<span class="n">db<span class="p">,</span></span></span></span></span></span></span></span></span></span></span></span></span></em><span class="n"><span class="o"><span class="nf"><span class="p"><span class="n"><span class="o"><span class="n"><span class="p"><span class="k"><span class="kt"><span class="o"><span class="n"><span class="p"><span class="k">const <span class="kt">char <span class="o">*<span class="n">collection<span class="p">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<div id="parameters" class="section">
<p><span>  参数</span></p>
<p>&nbsp;</p>
<p><code class="docutils literal notranslate"><span class="pre">    client</span></code><span>:一个</span>mongoc_client_t<span>。</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><code class="docutils literal notranslate"><span class="pre">    db</span></code><span>:包含集合的数据库的名称。</span></p>
<p>&nbsp;</p>
<p><code class="docutils literal notranslate"><span class="pre">    collection</span></code><span>:集合的名称。</span></p>
</div>
<div id="returns" class="section">
<p><span>  返回</span></p>
<p><span>    新分配的</span>mongoc_collection_t<span><span>,</span><span>当不再使用</span><span>时应使用</span></span>mongoc_collection_destroy()<span><span>释放</span><span>它。</span></span></p>
</div>
<p>&nbsp;</p>
<p>  3、mongoc_cursor_t *&nbsp; &nbsp; &nbsp; &nbsp; mongoc_collection_find_with_opts (mongoc_collection_t *&nbsp; collection,</p>
<p>                                 &nbsp; const bson_t *&nbsp; filter,</p>
<p>                                 &nbsp; const bson_t *&nbsp; &nbsp;opts,</p>
<p>                           const mongoc_read_prefs_t*&nbsp; &nbsp;read_prefs)</p>
<p>  </p>
<p>  参数<br>    collection:一个mongoc_collection_t。<br>    filter:bson_t包含要执行的查询的。<br>    opts:bson_t查询选项,包括排序顺序和要返回的字段。可以NULL。<br>    read_prefs:mongoc_read_prefs_t或NULL。</p>
<p>  返回<br>    新分配的mongoc_cursor_t,必须使用mongoc_cursor_destroy()释放。</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/yinguojin/p/13251968.html
頁: [1]
查看完整版本: MongoDB C驱动程序(libmongoc)(libbson)