libmongoc关于\$pullAll和\$addToSet的一个使用问题记录
2024-10-19 06:30:43
问题描述及测试结果
在使用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);
最新文章
- Java获取本机的IP与MAC地址
- OkHttp和Volley对比
- iOS 学习 - 10下载(1) NSURLConnection 篇
- iOS随机生成数字
- 对于Tomcat服务器环境变量和启动配置的一点补充
- udp穿透简单讲解和实现(Java)
- Android编码风格
- UIlabel 显示模糊
- python time模块详解(转)
- HTML 基础 1
- maven---settings.xml配置
- [转]解析多级json数据为list中嵌套一级字典的形式
- enum与typedef enum
- maven多个web模块进行合并
- 基于consul高可用
- latex表格代码
- eclipse default handler IHandler interface “the chosen operation is not enabled”
- CSS同时选择器
- shell 脚本实战笔记(3)--集群机器的时间同步设置
- C#实现盛大盛付通充值卡状态查询
热门文章
- 【C语言】字节对齐(内存对齐)
- Zookeeper笔记(一)初识Zookeeper
- Redis数据结构之哈希
- (转)获取 request 中用POST方式";Content-type";是";application/x-www-form-urlencoded;charset=utf-8";发送的 json 数据
- STL中实现 iterator trail 的编程技巧
- Metasploit AFP爆破模块afp_login
- internet连接共享
- 仙剑奇侠传 游戏 开发 教程 Xianjian qixia development Game development tutorial
- 3451: Tyvj1953 Normal 点分治 FFT
- php urlencode函数 (中文字符转换为十六进制)