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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理