设为首页 加入收藏

TOP

MongoDB C++ 数组的写操作(一)
2014-11-24 03:11:39 来源: 作者: 【 】 浏览:4
Tags:MongoDB 操作

经常会碰到这类问题,现在将前两年自己写过的代码总结一下,以后编程会方便很多。


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_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();
}


第二个函数添加了较复杂的数组,同时演示了update方法的使用。这个方法,假定receivers数组还不存在,采用$set命令进行设置。


void AssignScheduledMessages(ScheduledMessages & ms) {
shared_ptr mongo_session = mongo_session_factory::get_session();
vector >::iterator itor, last = ms.values.end();
for (itor = ms.values.begin(); itor != last; ++itor) {
shared_ptr 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


下面演示java script代码:


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


C++代码来了:


void SaveScheduleMessageStatus(string const& message_id, string const& address, string const& status) {
shared_ptr mongo_session = MongoSessionFactory::GetSession();
BSONObjBuilder condition;
condition.append("_id", OID

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇u-boot中的date命令 下一篇Android数据传输省电方法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·哈希表 - 菜鸟教程 (2025-12-24 20:18:55)
·MySQL存储引擎InnoDB (2025-12-24 20:18:53)
·索引堆及其优化 - 菜 (2025-12-24 20:18:50)
·Shell 中各种括号的 (2025-12-24 19:50:39)
·Shell 变量 - 菜鸟教 (2025-12-24 19:50:37)