问题描述及测试结果

在使用mongodb时,对一个document中的数组成员进行更新的时候,可以使用$pull $push $pop $addToSet $pullAll$each $position $slice $sort等操作符。

以下问题出现在$addToSetpullAll操作中,$set操作没有这个问题,其他的操作符没有测试,不知道有没有问题。

之前在libmongoc中更新一个对象,用到了这些操作的时候,对于添加进update这个bson对象中的数组成员,其key是没有要求的,大概如下:

// 更新对象的选择
bson_t* selector = BCON_NEW("_id",BCON_OID(_id));
// 更新的内容
bson_t* update = bson_new();
bson_t* each = bson_new();
bson_t array;
bson_append_array_begin(each, "$each", 5, &array);
// 向数组中逐个添加元素,itemArray是要添加的数据保存的数组
for(auto& item:itemArray){
// 以前这里添加的时候,key都使用'0'是没有问题的
bson_append_utf8(&array,"0",1,item.data(),item.size());
}
bson_append_array_end(each, &array);
bson_append_document(update,"$addToSet",9,each);
// 执行更新操作
mongoc_collection_update(
coll, MONGOC_UPDATE_NONE, selector, update, NULL, &error);

这是去年我写代码的时候的做法,这样的操作是一点问题都没有的。当时使用的MongoDB3.4.0版本,使用的libmongoc1.3.1版本。最近一个新项目中再次使用到了MongoDB,这次使用的是4.0.2版本,libmongoc使用的是1.9.3版本。

经过测试(lobmongoc1.9.3),这样的代码在MongoDB 4.0.2版本中,$addToSetpullAll两个有问题,无法实现多个成员的操作。在MongoDB3.4.0中,$addToSet是没有问题的,但是$pullAll也是只能移除一个,不能移除多个。我这里没有测试更多操作,因为只用到了这两个,也没有测1.3.1版本的lobmongoc,因为不能回退到这个版本了。

做如下修改可以完成正常想要的操作

// 更新对象的选择
bson_t* selector = BCON_NEW("_id",BCON_OID(_id));
// 更新的内容
bson_t* update = bson_new();
bson_t* each = bson_new();
bson_t array;
bson_append_array_begin(each, "$each", 5, &array);
// 向数组中逐个添加元素,itemArray是要添加的数据保存的数组
uint32_t i = 0;
for(auto& item:itemArray){
// 以前这里添加的时候,key都使用'0'是没有问题的
// bson_append_utf8(&array,"0",1,item.data(),item.size());
// 不能再使用像上面一样的同一个key,使用下面的形式
char keybuf[16];
const char *key = keybuf;
int keylen = bson_uint32_to_string(i++, &key, keybuf, sizeof(keybuf));
bson_append_utf8(&array,key,keylen,item.data(),item.size());
}
bson_append_array_end(each, &array);
bson_append_document(update,"$addToSet",9,each);
// 执行更新操作
mongoc_collection_update(
coll, MONGOC_UPDATE_NONE, selector, update, NULL, &error);

libmongoc关于\$pullAll和\$addToSet的一个使用问题记录的更多相关文章

  1. mysql中根据一个字段相同记录写递增序号,如序号结果,如何实现?

      mysql中根据一个字段相同记录写递增序号,如序号结果,如何实现? mysql中实现方式如下: select merchantId, NameCn, send_date, deliver_name ...

  2. Oracle 数据库基础学习 (二) 学习小例子:创建一个表,记录商品买卖的情况

      运行环境:Oracle database 11g + PL/SQL Developer ex: --创建一个表 create table plspl_test_product( --加入not n ...

  3. 以Access为支撑,书写一个C#写入记录的案例

    /// <summary> /// 读取Excel文档 /// </summary> /// <param name="Path">文件名称&l ...

  4. cocos2dx 做test遇到一个问题,记录下来

    我新建了一个group,然后再group里面创建一个文件A.h,再A.h中#include group同一级的文件CBaseTest.h,方法是: #include "../BaseTest ...

  5. 用Access作为后台数据库支撑,书写一个C#写入记录的案例

    要想操作一个数据库,不论是那种操作,首先要做的肯定是打开数据库. 下面我们以ACCESS数据库来做例子说明如何打开一个数据库连接!   在这里我们需要用到的是: System.Data.OleDb.O ...

  6. ORACLE 从一个实例迁移到另外一个实例实战记录

    .schema1到schema2的迁移 Oracle 从一个用户expdp导出再impdp导入到还有一个用户,能够使用REMAP_SCHEMA=user1:user2来实现: 假设想导入的用户已经存在 ...

  7. java用毫秒数做日期计算的一个踩坑记录

    错误示例: Date today = new Date(); Date nextMonth = new Date(today.getTime() + 30* 1000*60*60*24); print ...

  8. 部署一个flask服务记录

    最近使用flask写了一些简单的服务. 服务部署到服务器上进行使用,这个过程会有一些问题,需要进行记录一下. 说明运行的环境情况.使用的是python3.6的虚拟环境,系统是centos7,其他的有u ...

  9. my23_pxc其中一个节点重建记录

    PXC报废了一个节点,时间大概在周五,而此时故障的数据库节点比较多,警告信息也成百上千,此信息混合于已有的故障节点信息中,没有被及时发现:然后周六.周日各报废一个,在周一的时候,业务已经没有节点可以写 ...

随机推荐

  1. JQuery中的工具类(五)

    一:1.serialize()序列表表格内容为字符串.返回值jQuery示例序列表表格内容为字符串,用于 Ajax 请求. HTML 代码:<p id="results"&g ...

  2. VS2010发布、打包安装程序(超全超详细)

    1. 在vs2010 选择“新建项目”→“ 其他项目类型”→“ Visual Studio Installer→“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三个文件夹, 1.“应 ...

  3. 在vs2008工程中制作cab包

    内容转自MSDN 1.首先,制作自己的智能设备工程 2.添加cab工程: 为解决方案添加智能设备 CAB 项目 打开现有的智能设备项目,并确保“解决方案资源管理器”可见. 在“文件”菜单上指向“添加” ...

  4. go语言中goroute使用:=遇到的坑

    先看下源代码,预想从1至N总取出所有能被a或b整除的正整数之和,为了利用go语言的并行优势,特使用goroute特性来实现,同时使用普通顺序计算进行效率比较分析 package chango impo ...

  5. WebPack 学习:从阮神的15个DEMO开始

    WebPack 是什么 官方就一句话,打包所有的资源. 从阮神的 15 DEOM入手 Webpack Github 地址 阮神GIT 按照 ReadME 操作 npm webpack-dev-serv ...

  6. anaconda虚拟环境管理,从此Python版本不用愁

    1 引言 在前几篇博文中介绍过virtualenv.virtualenvwrapper等几个虚拟环境管理工具,本篇要介绍的anaconda也有很强大的虚拟环境管理功能,甚至相比virtualenv.v ...

  7. SQL try

    BEGIN TRY -- Generate a constraint violation error. DELETE FROM Production.Product ; END TRY BEGIN C ...

  8. POJ.3710.Christmas Game(博弈论 树上删边游戏 Multi-SG)

    题目链接 \(Description\) 给定n棵"树",每棵"树"的节点可能"挂着"一个环,保证没有环相交,且与树只有一个公共点. 两人轮 ...

  9. NOIP 竞赛注意事项

    <一>程序习惯注意 一.Linux与Windows的区别 a) 大小写敏感 i.   在Windows下,文件名大小写不敏感,例如A.c 与 a.c 与和a.C与A.C和没有区别. ii. ...

  10. 图片循环滚动效果shader

    背景无限循环滚动效果,有X和Y轴的速度控制,方便控制.见下图,操作步骤同之前的背景循环设置. shader如下: Shader "Custom/Scroll" { Properti ...