MongoDB C++ 数组的写操作
来源:互联网 发布:js调用dll动态链接库 编辑:程序博客网 时间:2024/05/29 16:31
经常会碰到这类问题,现在将前两年自己写过的代码总结一下,以后编程会方便很多。
Document中包含两个数组,一个简单点,每个元素都是string,一个复杂点,每个元素都是一个对象,有两个属性address和status.
> db.schedule.findOne({"_id" : ObjectId("51e930f92291307bb05a1a84")}){"_id" : ObjectId("51e930f92291307bb05a1a84"),"direction" : 2,"messages" : ["m1","m2","m3"],"receivers" : [{"address" : "000000000020","status" : "waiting"},{"address" : "000000000018","status" : "waiting"}],"speed" : 3,"start_time" : "1374236921","stay_time" : 1,"user_id" : ObjectId("518b7fc5117e87bce28f2444")}c++代码如下:
这个函数填充简单的数组,用到了BSONArrayBuilder. 注意其演示了insert方法的使用。
string AddScheduledMessage(ScheduledMessage const& m) { shared_ptr<mongo_session> mongo_session = mongo_session_factory::get_session(); BSONObjBuilder data_builder; OID _id = OID::gen(); data_builder.append("_id", _id); data_builder.append("user_id", mongo::OID(m.user_id)); data_builder.append("start_time", m.start_time); data_builder.append("direction", m.direction); data_builder.append("speed", m.speed); data_builder.append("stay_time", m.stay_time); BSONArrayBuilder msgs_builder; size_t size = m.msgs.size(); for (size_t i = 0; i < size; ++i) { msgs_builder.append(m.msgs[i]); } data_builder.append("messages", msgs_builder.arr()); mongo_session->get().insert("db.schedule", data_builder.obj()); return _id.str();}
void AssignScheduledMessages(ScheduledMessages & ms) { shared_ptr<mongo_session> mongo_session = mongo_session_factory::get_session(); vector<shared_ptr<ScheduledMessage> >::iterator itor, last = ms.values.end(); for (itor = ms.values.begin(); itor != last; ++itor) { shared_ptr<ScheduledMessage> m = *itor; BSONObjBuilder condition; condition.append("user_id", OID(m->user_id)); condition.append("_id", OID(m->id)); BSONArrayBuilder arr_builder; size_t size = m->receivers.size(); for (size_t i = 0; i < size; ++i) { BSONObjBuilder rec; rec.append("address", m->receivers[i]->address); rec.append("status", m->receivers[i]->status); arr_builder.append(rec.obj()); } BSONObjBuilder recs; recs.append("receivers", arr_builder.arr()); BSONObjBuilder set; set.append("$set", recs.obj()); mongo_session->get().update("db.schedule", mongo::Query(condition.obj()), set.obj()); }}
再复杂点。现在想修改一下address为00...20的那个元素的status="sending"。具体原理参考:
http://stackoverflow.com/questions/9247007/mongodb-update-the-specific-element-from-subarray
下面演示JavaScript代码:
db.schedule.update({"_id" : ObjectId("51e930f92291307bb05a1a84"), "receivers": {$elemMatch: {"address": "000000000020"}}}, {$set: {"receivers.$.status": "sending"}})> db.schedule.findOne(){"_id" : ObjectId("51e930f92291307bb05a1a84"),"direction" : 2,"messages" : ["m1","m2","m3"],"receivers" : [{"address" : "000000000020","status" : "sending"},{"address" : "000000000018","status" : "waiting"}],"speed" : 3,"start_time" : "1374236921","stay_time" : 1,"user_id" : ObjectId("518b7fc5117e87bce28f2444")}
$ 这是个占位符,表示第一个被找到的数组元素。文档:http://docs.mongodb.org/manual/core/update/#array
void SaveScheduleMessageStatus(string const& message_id, string const& address, string const& status) { shared_ptr<MongoSession> mongo_session = MongoSessionFactory::GetSession(); BSONObjBuilder condition; condition.append("_id", OID(message_id)); BSONObjBuilder con1; con1.append("address", address); BSONObjBuilder con2; con2.append("$elemMatch", con1.obj()); condition.append("receivers", con2.obj()); BSONObjBuilder recs; recs.append("receivers.$.status", status); BSONObjBuilder set; set.append("$set", recs.obj()); mongo_session->GetDBClientBase().update("db.schedule", mongo::Query(condition.obj()), set.obj());}
- mongodb数组写操作
- MongoDB C++ 数组的写操作
- MongoDB C++ 数组的写操作
- MongoDB数组的操作
- Mongodb 的C语言操作
- mongodb写操作总结
- mongodb--写操作
- MongoDB多维数组的更新操作
- iOS,关于C结构体数组在子线程中写的操作
- 一组关于SQLAnywhere12和MongoDB的benchMark测试(写操作)
- 【MongoDB】Java驱动下,反射实现DAO的写操作
- MongoDB之数组更新操作
- Mongodb 内嵌数组操作
- MongoDB 数组遍历操作 forEach
- mongodb 批量更新 操作文档的数组键
- MongoDB:mongodb的索引操作
- MongoDB:mongodb的索引操作
- 用C#操作Mongodb(c#mongodb驱动)
- HDU-1008
- Linux动态频率调节系统CPUFreq之二:核心(core)架构与API
- 一位应届毕业生分享的求职经验
- 事务
- 手把手教你maven+sonar:项目部署
- MongoDB C++ 数组的写操作
- 字符编解码的故事(ASCII,GBK,Unicode,Utf-8区别)
- HDU-2000
- 基于TCP的 C/S模式 网络应用程序
- WIN7 安装盘 利用Diskpart命令分区方法
- oracle中最常见的数据类型
- Android.mk
- PHP中特殊HTML元素的转换
- 寻找第K大的数的方法总结