MongoDB CDriver 如何更新索引 N 中的数组对象?

标签 mongodb mongo-c-driver

我有这样的文档:

{
    "_id" : ObjectId("5768e43"),
    "APPID" : {
        "Number" : 0,
    },
    sessions : [{
            id : 111111,
            "setOID" : {
                "Number" : 0
            },
            "custID" : {
                "Number" : 0
            },

        }, {
            id : 133333,
            "setOID" : {
                "Number" : 2
            },
            "custID" : {
                "Number" : 2
            },
        }, {
            id : 7777,
            "setOID" : {
                "Number" : 2
            },
            "custID" : {
                "Number" : 2
            },

        },
    ]
}

我喜欢获取其 id == 133333(在 [1] 中)的 session 元素 并能够用新值更新它并向它添加新元素 所以它看起来像这样:

{
    id : 133333,
    "setOID" : {
        "Number" : 3333

    },
    "custID" : {
        "Number" : 4444

    },
    new_attr_1 : 0
    new_attr_2 : 2
},

C Driver的文档很难看懂 有人可以展示最好的方法吗?

更新
我尝试使用 cdriver 版本 1.4(最新)并且发生了奇怪的事情 更新失败(returend true) 但是文档中没有更新

 bson_t *query2 = BCON_NEW ("sessions.id ", BCON_INT32 (133333));    
 bson_t *update;

update = BCON_NEW ("$set", "{","Sessions.$.new_attr_1" ,BCON_INT32 (0) ,"}");

if (!mongoc_collection_update (collection,MONGOC_UPDATE_NONE, query2, update, NULL, &error)) {
    fprintf (stderr, "%s\n", error.message);
    goto fail;
}

当您看到发生了很多奇怪的事情时,我如何检查更新是否真的成功了?

最佳答案

在这里回答你的问题是一个解决方案:

db.doc.update({"sessions.id":133333},
              {$set: {"sessions.$.setOID.Number":3333,
                      "sessions.$.custID.Number":4444,
                      "sessions.$.new_attr_1" : 0,
                      "sessions.$.new_attr_2" : 2
                     }
              })

C 盘应该是这样的:

static void updateSession( mongo_connection *conn ) {
  bson cond[1], op[1];

  bson_init( cond );
    bson_append_int( cond, "sessions.id",133333);
  bson_finish( cond );

  bson_init( op );
    bson_append_start_object( op, "$set" );
      bson_append_int( op, "sessions.$.setOID.Number",3333);
      bson_append_int( op, "sessions.$.custID.Number",4444);
      bson_append_int( op, "sessions.$.new_attr_1",0);
      bson_append_int( op, "sessions.$.new_attr_2",2);
    bson_append_finish_object( op );
  bson_finish( op );

  mongo_update( conn, "db.doc", cond, op, MONGO_UPDATE_BASIC );

  bson_destroy( cond );
  bson_destroy( op );
}

关于MongoDB CDriver 如何更新索引 N 中的数组对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38097500/

相关文章:

mongodb - 使用 gte 和 lte 查询在 mongodb 中无法获得准确的结果

mongodb - 蒙戈克司机 : how to query based on ISOdate?

c - 如何使用 MongoDB C 驱动程序和 FoundationDB 文档层进行事务处理?

c# - MongoDB 创建动态查询

ruby-on-rails - 获取所有 child 的 child 等等

javascript - 如何使用 AJAX 成功函数更新动态创建的号码?

python - 获取收集字节使用情况统计信息的pymongo方法?

node.js - 我应该如何为嵌套文档建模 MongoDB 集合?

c++ - Windows LNK2001 : unresolved external symbol __imp_mongoc_read_prefs_new 中的 Mongocxx

c - valgrind - 使用 C api 连接到 mongodb 而不会导致 SIGSEGV