libmongoc关于\$pullAll和\$addToSet的一个使用问题记录
问题描述及测试结果
在使用mongodb时,对一个document中的数组成员进行更新的时候,可以使用$pull $push $pop $addToSet $pullAll和$each $position $slice $sort等操作符。
以下问题出现在$addToSet和pullAll操作中,$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);
这是去年我写代码的时候的做法,这样的操作是一点问题都没有的。当时使用的MongoDB是3.4.0版本,使用的libmongoc是1.3.1版本。最近一个新项目中再次使用到了MongoDB,这次使用的是4.0.2版本,libmongoc使用的是1.9.3版本。
经过测试(lobmongoc1.9.3),这样的代码在MongoDB 4.0.2版本中,$addToSet和pullAll两个有问题,无法实现多个成员的操作。在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的一个使用问题记录的更多相关文章
- mysql中根据一个字段相同记录写递增序号,如序号结果,如何实现?
mysql中根据一个字段相同记录写递增序号,如序号结果,如何实现? mysql中实现方式如下: select merchantId, NameCn, send_date, deliver_name ...
- Oracle 数据库基础学习 (二) 学习小例子:创建一个表,记录商品买卖的情况
运行环境:Oracle database 11g + PL/SQL Developer ex: --创建一个表 create table plspl_test_product( --加入not n ...
- 以Access为支撑,书写一个C#写入记录的案例
/// <summary> /// 读取Excel文档 /// </summary> /// <param name="Path">文件名称&l ...
- cocos2dx 做test遇到一个问题,记录下来
我新建了一个group,然后再group里面创建一个文件A.h,再A.h中#include group同一级的文件CBaseTest.h,方法是: #include "../BaseTest ...
- 用Access作为后台数据库支撑,书写一个C#写入记录的案例
要想操作一个数据库,不论是那种操作,首先要做的肯定是打开数据库. 下面我们以ACCESS数据库来做例子说明如何打开一个数据库连接! 在这里我们需要用到的是: System.Data.OleDb.O ...
- ORACLE 从一个实例迁移到另外一个实例实战记录
.schema1到schema2的迁移 Oracle 从一个用户expdp导出再impdp导入到还有一个用户,能够使用REMAP_SCHEMA=user1:user2来实现: 假设想导入的用户已经存在 ...
- java用毫秒数做日期计算的一个踩坑记录
错误示例: Date today = new Date(); Date nextMonth = new Date(today.getTime() + 30* 1000*60*60*24); print ...
- 部署一个flask服务记录
最近使用flask写了一些简单的服务. 服务部署到服务器上进行使用,这个过程会有一些问题,需要进行记录一下. 说明运行的环境情况.使用的是python3.6的虚拟环境,系统是centos7,其他的有u ...
- my23_pxc其中一个节点重建记录
PXC报废了一个节点,时间大概在周五,而此时故障的数据库节点比较多,警告信息也成百上千,此信息混合于已有的故障节点信息中,没有被及时发现:然后周六.周日各报废一个,在周一的时候,业务已经没有节点可以写 ...
随机推荐
- python包管理之Pip安装及使用-1
Python有两个著名的包管理工具easy_install.py和pip.在Python2.7的安装包中,easy_install.py是默认安装的,而pip需要我们手动安装. pip可以运行在Uni ...
- Ext.js入门(二)
ExtJs OOP基础 一:ExtJs中的面向对象 1.ExtJs中命名空间的定义 Ext中的命名空间类似于C#中的namespace和java中的包,用来对工程中的类进行更好的 ...
- VS增加插件 Supercharger破解教程
VS增加插件 Supercharger破解教程 Supercharger效果预览及下载路径: http://supercharger.tools/index.html 下载地址:https://vis ...
- hdu 1757 和1005差不多 (矩阵快速幂)
If x < 10 f(x) = x.If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-1 ...
- Spring Boot自动扫描
进行Spring Boot和Mybatis进行整合的时候,Spring Boot注解扫描的时候无法扫描到Application类的以外的包下面的注解,如下图: App就是Application类,下图 ...
- SpringBank 开发日志 Mybatis 使用redis 作为二级缓存时,无法通过cacheEnabled=false 将其关闭
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
- Python字符串capitalize center 方法
一.capitalize 首字母大写 name = "wohaoshuai" print(name.capitalize()) #首字母大写 Wohaoshuai 二.center ...
- FastAdmin 的上传代码在哪里?
FastAdmin 的上传代码在哪里? FastAdmin 默认是通过 Ajax 上传到本地. 使用 admin/ajax/upload 方式返回 url. 代码文件地址在 application\a ...
- UVA 10815 Andy's First Dictionary【set】
题目链接:https://vjudge.net/contest/211547#problem/C 题目大意: 输入一个文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出,单词不区分大小写 ...
- metasploit常见服务的漏点扫描模块
弱点扫描 根据信息收集结果搜索漏洞利用模块 结合外部漏洞扫描系统对大IP地址段进行批量扫描 可以考虑对单个ip,单个服务进行扫描 NVC 密码破解端口:5900use auxiliary/scanne ...