使用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;
}