最近因为项目须要,大体研究了一下protobuf的java使用。说实话,习惯了C++的protobuf,java用起来真别扭。java
java在mongodb中的存储其实很是方便,假设有定义一个proto,以下所示:mongodb
message User { required int64 id = 1; required string name = 2; }
那么能够利用一下代码,对protobuf进行存储数据库
// 设置user User.Builder builder = User.newBuilder(); builder.setId(123); builder.setName("abc"); // 实例化user User user = builder.build(); // 序列化成byte数组 byte[] ub = user.toByteArray(); // 与mongodb创建链接 MongoClient cli = new MongoClient("localhost", 2000); // 切换至user_info数据库 DB db = cli.getDB("user_info"); // 选择集合user DBCollection coll = db.getCollection("user"); // 插入更新数据 DBObject condition = new BasicDBObject(); condition.put("user_id", user.getId()); DBObject data = new BasicDBObject(); data.put("user_id", user.getId()); data.put("model", ub); // 第三个参数设置为true,表示upsert coll.update(condition, data, true, false);
若是须要得到存储的数据,可利用一下代码:数组
DBCursor cur = coll.find(condition); while(cur.hasNext()) { DBObject obj = cur.next(); Binary m = (Binary)result.get("model"); byte[] xx = m.getData(); break; }
若是须要跨语言平台获取数据,这里以C++为例:ui
std::string content;std::auto_ptr<mongo::DBClientCursor> cursor = conn->query("user_info.user", query.obj()); while (cursor->more()) { mongo::BSONObj obj = cursor->next(); if (!obj.isEmpty() && obj.isValid()) { mongo::BSONElement elm = obj.getField("model"); int len = 0; const char *b = elm.binData(len); content.assign(b, len); ret = true; } break; }