使用mongoc driver读写mongoDB

使用mongoc driver读写mongoDB, 虽然有mongocpp 在虚拟机上安装成功,但在服务器上始终编译错误,所以只能退而求其次使用  mongoc driver。下面是一个脚本 

root@iZ25x7gak9qZ:/data/script/mongo# cat move_company_to_mongo.cpp
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>
#include <mysql++.h>
#include <mongoc.h>
#include <json/json.h>

using std::string;
using std::cout;
using std::endl;

typedef mysqlpp::Connection* SqlConn;
typedef std::vector<string> VecStr;


SqlConn create_sql_connection(){
    const char* host="uhost://address";
    const char* user="uname";
    const char* pass="upass";
    const char* db="udb";

    SqlConn conn=new mysqlpp::Connection(true);
    conn->set_option(new mysqlpp::SetCharsetNameOption("utf8"));
    conn->connect(db,host,user,pass);
    return conn;
}
void query_clue(SqlConn conn,VecStr& vecstr, const string& sql){
    mysqlpp::Query query = conn->query(sql);
    if(mysqlpp::StoreQueryResult res=query.store()){
        for(auto cid=res[0].begin();cid!=res[0].end();++cid){
            string temp=string(*cid);
            temp=(temp!="NULL" && temp!="None")? temp:"";
            vecstr.push_back(temp);
        }
    }
}

string query_company_mongoID(mongoc_collection_t* companys,
            const string& comName){
    mongoc_cursor_t* cursor;
    string strQuery="{\"companyPortray.comName\":\""+comName+"\"}";
    string strOpts="{\"projection\":{\"_id\":1}}";
    bson_t* bsonQuery=bson_new_from_json(
            (const uint8_t*)strQuery.data(),-1,NULL);
    bson_t* bsonOpts=bson_new_from_json(
            (const uint8_t*)strOpts.data(),-1,NULL);
    cursor=mongoc_collection_find_with_opts(
            companys,bsonQuery,bsonOpts,NULL);
    string res("");
    const bson_t* doc;
    while(mongoc_cursor_next(cursor,&doc)){
        res=bson_as_json(doc,NULL);
    }
    bson_destroy(bsonQuery);
    bson_destroy(bsonOpts);
    mongoc_cursor_destroy(cursor);
    return res;
}

void erase_blank(string& comName){
    int n=0;
    const char xstr=' ';
    while(n!=comName.npos){
        n=comName.find(xstr);
        if(n!=comName.npos){
            comName.erase(n,1);
        }
    }
}

int main(int argc, char** argv){
    const char* file="clue_id_20171024";
    const char* uri="mongodb://uname:upass@address:27017/udb";
    mongoc_client_t* client;
    mongoc_database_t* database;
    mongoc_collection_t* companys;
    mongoc_collection_t* persons;
    mongoc_collection_t* relations;
    bson_t* person;
    bson_t* relation;

    bson_error_t error_p;
    bson_error_t error_r;

    client=mongoc_client_new(uri);
    companys=mongoc_client_get_collection(client,"udb","companys");
    database=mongoc_client_get_database(client,"udb");
    const char* p="persons";
    const char* r="relations";
    //if(mongoc_database_has_collection(database, p,NULL)){
    //    //persons=mongoc_database_get_collection(database,p);
    //    //mongoc_collection_drop(persons,NULL);
    //}
    //persons=mongoc_database_create_collection(database,p,NULL,NULL);
    persons=mongoc_database_get_collection(database,p);

    //if(mongoc_database_has_collection(database, r,NULL)){
    //    //relations=mongoc_database_get_collection(database,r);
    //    //mongoc_collection_drop(relations,NULL);
    //}
    //relations=mongoc_database_create_collection(database,r,NULL,NULL);
    relations=mongoc_database_get_collection(database,r);

    SqlConn conn=create_sql_connection();
    std::ifstream fin(file);
    string clueid("");
    VecStr vecstr;
    while(fin.good()){
        std::getline(fin,clueid);
        if(clueid.size()>0){
            //cout << clueid << endl;
            string sql = "select Clue_Entry_Name_clean,\
Clue_Entry_Com_Name_clean,Clue_Entry_Cellphone_clean,Clue_Entry_\
Qq_clean,Clue_Entry_Wechat,Clue_Entry_Email_clean,Clue_Entry_Major\
_clean,Clue_Entry_Birthday_clean,chuanzhen from crm_t_clue where \
clue_id='"+clueid+"';";
            query_clue(conn,vecstr,sql);

            string name=vecstr[0];
            string qq=vecstr[3];
            string wechat=vecstr[4];
            string email=vecstr[5];
            string birthday=vecstr[7]; //date
            string fax=vecstr[8];
            int gender=-1; //int

            //关系表
            string position=vecstr[6];
            string contact=vecstr[2];
            //string clueid=;
            int orgType=1; //int
            //string orgID=mongoID;
            int contactType=1; //int
            int status=0; //int

            string comName=vecstr[1];
            string cmongoID=query_company_mongoID(companys,comName);
            int num = (cmongoID.size()>0)?1:0;
            if(cmongoID.size()>0){
                bson_oid_t oid;
                bson_oid_init(&oid,NULL);
                Json::Value root;
                Json::Reader reader;
                reader.parse(cmongoID,root);
                string comOid=root["_id"]["$oid"].asString();
                bson_oid_t orgID;
                bson_oid_init_from_string(&orgID,comOid.data());
                person=BCON_NEW(
                            "_id",BCON_OID(&oid),
                            "name",BCON_UTF8(name.data()),
                            "qq",BCON_UTF8(qq.data()),
                            "email",BCON_UTF8(email.data()),
                            "wechat",BCON_UTF8(wechat.data()),
                            "fax",BCON_UTF8(fax.data()),
                            "gender",BCON_INT32(gender),
                            "birthday",BCON_NULL
                            );
                relation=BCON_NEW(
                            "personID",BCON_OID(&oid),
                            "orgID",BCON_OID(&orgID),
                            "clueID",BCON_UTF8(clueid.data()),
                            "orgType",BCON_INT32(orgType),
                            "contact",BCON_UTF8(contact.data()),
                            "contactType",BCON_INT32(contactType),
                            "status",BCON_INT32(status)
                            );
                bool pres=mongoc_collection_insert(persons,MONGOC_INSERT_NONE,person,NULL,&error_p);
                bool rres=mongoc_collection_insert(relations,MONGOC_INSERT_NONE,relation,NULL,&error_r);
                if((!pres) || (!rres)){
                    if(!pres)
                      cout << clueid << "\t" << error_p.message << endl;
                    if(!rres)
                      cout << clueid << "\t" << error_r.message << endl;
                }
                //string person_str(bson_as_json(person,NULL));
                //string relation_str(bson_as_json(relation,NULL));
                //cout << pres << " " << rres << endl;

                //cout << person_str << endl;
                //cout << relation_str << endl;
                bson_clear(&person);
                bson_clear(&relation);
            }
        }
        vecstr.clear();
    }

    conn->disconnect();
    bson_destroy(person);
    bson_destroy(relation);
    mongoc_collection_destroy(companys);
    mongoc_collection_destroy(persons);
    mongoc_collection_destroy(relations);
    mongoc_database_destroy(database);
    mongoc_client_destroy(client);
    mongoc_cleanup();
    //delete error_p;
    //delete error_r;
}

 

转载于:https://my.oschina.net/lCQ3FC3/blog/1555465

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值