zoukankan      html  css  js  c++  java
  • libmongoc关于$pullAll和$addToSet的一个使用问题记录

    问题描述及测试结果

    在使用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);
    
  • 相关阅读:
    课后作业
    使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。
    课程作业·02
    课程作业01
    课程作业02 将课程中的所有动手动脑的问题以及课后实验性的问题,整理成一篇文档。
    课程作业01 模仿JavaAppArguments.java示例,编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。
    《大道至简》第一章伪代码
    Vue2.0版英雄联盟助手,我的第一个小开源项目
    二级下拉菜单的三种实现方法——CSS 、JS、 jQuery
    关于清除浮动 and position的一些注意点
  • 原文地址:https://www.cnblogs.com/oloroso/p/9578888.html
Copyright © 2011-2022 走看看