關於MongoDB API的兩個小經驗

來源:互聯網
上載者:User

標籤:data   操作   項目   比較   val   jar   integer   ini   轉換   

一、前言

MongoDB也是項目的備選平台,需要用Java和C/C++進行操作。別的不多說,幾個關鍵要求:

1 Collection的列有int, long和BinData(也即位元組)類型;

2 Java和C程式寫入的資料可以互相讀取。

 

二、Java實現BinData讀

Java工程裡引入mongo-java-driver.jar依賴即可,範例程式碼很多,這裡就不貼了。

別的Column都簡單,僅僅在讀取BinData時有些麻煩,因為MongoDB的Java API沒有直接提供getBinary之類的介面。

解決辦法是:引入org.bson.types.Binary類,再轉換一下即可:

     Binary binary = (Binary) doc.get("Data");     obj.setData((byte[]) binary.getData());

順便說一下,寫BinData直接用doc.append()即可,無須擔心。

另外,C/C++ API使用的是mongo-c-driver,其中對BinData都有專門的介面,也比較簡單。

 

三 、C/C++程式的讀取順序

測試過程中曾出現一個奇怪的問題,就是C/C++程式寫入的資料,Java程式可以正取讀取,反之則不行。

折騰半天后找到原因:Java API中讀取用的是doc.getXxxx(String )方法,與順序無關。

MongoCursor<Document> cursor = collection.find(docFilter).iterator();        while (cursor.hasNext())        {            Document doc = cursor.next();            //讀取順序無所謂            int col2 = doc.getInteger("COL2").intValue();            long col3 = doc.getLong("COL3").longValue();            int col1 = doc.getInteger("COL1").intValue();            ...        }

 

而在C/C++ API中,讀取用的是bson_iter_find(bson_iter_t*, const char*)和bson_iter_xxxx(bson_iter_t*)函數的組合,這裡順序很重要,必須與寫入時保持一致(寫入順序和儲存順序也是一致的)。

 mongoc_cursor_t cursor = mongoc_collection_find_with_opts(collection, query, NULL, NULL);

   while (mongoc_cursor_next(cursor, &doc))
  {

    int col1, col2;

    long col3;

    bson_iter_t iter;

    bson_iter_init (&iter, doc);

    //必須與寫入時順序一致

    if (bson_iter_find(&iter, "COL1")) 

      col1 = bson_iter_int32(&iter);

    if (bson_iter_find(&iter, "COL3")) 

      col3 = bson_iter_int64(&iter);

     if (bson_iter_find(&iter, "COL2")) 

      col2 = bson_iter_int32(&iter);

     ...

  }

假設寫入資料的順序是COL1, COL2, COL3,則上段代碼中只能獲得col1和col2的值,而col3將被跳過。

項目中,將Java程式和C/C++程式的寫入順序都調整一致,再在C/C++程式中按相同順序讀取,問題解決。

 

關於MongoDB API的兩個小經驗

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.