热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++数组写入到MongoDB数据库

经常会碰到这类问题,现在将前两年自己写过的代码总结一下,以后编程会方便很多。Document中包含两个数组,一个简单点,每个元素都是string,一个复杂点,每个元素都是一个对象,有两个属性address和status.db.schedule.findOne({_id:ObjectId(51e930f

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

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     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       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

Name Description
$ Acts as a placeholder to update the first element that matches the query condition in an update.

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


推荐阅读
  • 本文介绍了如何使用Node.js通过两种不同的方法连接MongoDB数据库,包括使用MongoClient对象和连接字符串的方法。每种方法都有其特点和适用场景,适合不同需求的开发者。 ... [详细]
  • 第一步java代码条件匹配与之对应的mongo数据查询第二步:java代码分组查询与之所对应的mongodb中sheel与所得出的表点击某个_id字段进入,所得出的图表为第三步:在 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • 在 Angular Google Maps 中实现图片嵌入信息窗口的功能,可以通过使用 `@agm/core` 库来实现。该库提供了丰富的 API 和组件,使得开发者可以轻松地在地图上的信息窗口中嵌入图片。本文将详细介绍如何配置和使用这些组件,以实现动态加载和显示图片的功能。此外,还将探讨一些常见的问题和解决方案,帮助开发者更好地集成这一功能。 ... [详细]
  • MongoVUE基础操作指南:轻松上手数据库管理
    本文介绍了MongoVUE的基础操作,旨在帮助用户轻松掌握数据库管理技巧。MongoVUE是一款功能强大的MongoDB客户端工具,虽然需要注册,但其用户友好的界面和丰富的功能使其成为许多开发者的首选。文中详细解释了安装步骤、基本配置以及常见操作方法,并对一些常见的问题进行了修正和补充,确保用户能够快速上手并高效使用MongoVUE进行数据库管理。 ... [详细]
  • MongoDB高可用架构:深入解析Replica Set机制
    MongoDB的高可用架构主要依赖于其Replica Set机制。Replica Set通过多个mongod节点的协同工作,实现了数据的冗余存储和故障自动切换,确保了系统的高可用性和数据的一致性。本文将深入解析Replica Set的工作原理及其在实际应用中的配置和优化方法,帮助读者更好地理解和实施MongoDB的高可用架构。 ... [详细]
  • 本文探讨了如何在 Google Sheets 中通过自定义函数实现 AJAX 调用。具体介绍了编写脚本的方法,以便在电子表格中发起 AJAX 请求,从而实现数据的动态获取与更新。这种方法不仅简化了数据处理流程,还提高了工作效率。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • 在使用关系型数据库时,通常需要通过用户名和密码进行身份验证才能访问数据。然而,MongoDB默认情况下并不强制要求这种身份验证机制,使得用户无需凭据即可访问并执行各种操作。虽然这一设计简化了初学者的上手过程,但也带来了显著的安全风险。为了提升MongoDB的连接安全性,本文将探讨多种策略与实践,包括启用身份验证、配置网络访问控制、加密通信以及定期审计安全设置,以确保数据库的安全性和数据的完整性。 ... [详细]
  • 成功实现Asp.Net MVC3网站与MongoDB数据库的高效集成
    我们成功地构建了一个基于Asp.NET MVC3框架的网站,并实现了与MongoDB数据库的高效集成。此次更新不仅完善了基本的创建和显示功能,还全面实现了数据的增删改查操作。在创建功能方面,我们修复了之前代码中的错误,确保每个属性都能正确生成。此外,我们还对数据模型进行了优化,以提高系统的性能和稳定性。 ... [详细]
  • 修复一个 Bug 竟耗时两天?真的有那么复杂吗?
    修复一个 Bug 竟然耗费了两天时间?这背后究竟隐藏着怎样的复杂性?本文将深入探讨这个看似简单的 Bug 为何会如此棘手,从代码层面剖析问题根源,并分享解决过程中遇到的技术挑战和心得。 ... [详细]
author-avatar
mobiledu2502890451
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有