Mongo:将JSON转换为BSON时出错

时间:2016-04-23 14:49:35

标签: c mongodb gcc mongo-c-driver

我正在尝试使用Mongo C驱动程序将以下MongoDB JSON命令转换为有效的BSON:

db.test.update({
   "_id" : ObjectId("5624200d4bacd3940b8b2d62"),
  "folders.folder_id": "3_root",
  "folders.files": { $elemMatch: { "file": "5BD252AD-10C9-4DCE-A59C-5E3223BDDC60"}} },
  {$inc : { "folders.0.files.$.favorites.0.like": 1} }
);

我试图使用以下方法创建它:

query = BCON_NEW ("_id", BCON_OID(&oid));
BSON_APPEND_UTF8 (query, "folders.folder_id", folderPositionRaw);
BSON_APPEND_UTF8 (query, "folders.files", "{" , "$elemMatch","{","file","5BD252AD-10C9-4DCE-A59C-5E3223BDDC60","}","}");

update = BCON_NEW ("$inc", 
    "{", 
    "folders.0.files.$.favorites.0.like", 1,
    "}");
mongoc_collection_update (collection, MONGOC_UPDATE_NONE, query, update, NULL, &error);

但它方式错误。

当我编译时,我得到:

  

/current/set_fav.c:在函数'main'中:
  /current/set_fav.c:102:警告:初始化从指针目标类型中丢弃限定符   /current/set_fav.c:168:122:错误:宏" BSON_APPEND_UTF8"通过9个参数,但只需3个   /current/set_fav.c:168:错误:'BSON_APPEND_UTF8'未声明(首次使用此功能)
  /current/set_fav.c:168:错误:(每个未声明的标识符仅报告一次   /current/set_fav.c:168:错误:对于它出现的每个函数。)

仅供参考:folderPositionRaw的代码值3_root设置得更高。

添加更多信息:最初我有错误的Mongo语法,但C很高兴。我使用以下内容:

query = bson_new ();
bson_oid_init_from_string (&oid, tribe_id);
query = BCON_NEW ("_id", BCON_OID(&oid));       
BSON_APPEND_UTF8 (query, "folders.folder_id", folderPositionRaw);
BSON_APPEND_UTF8 (query, "folders.folder_id.$.files.file", file);

我从我的数据库团队那里得到了帮助,给了我正确的Mongo语法(帖子顶部),并且在尝试将其结构化为C BSON时,我做错了。

取得一些进展:

我已经更新了我的代码并且它们不再崩溃这是一个好兆头,但是发送到Mongo的输出JSON没有完全正确地构造。我认为问题是在mongo $ inc命令中发送的值1是作为标量1而不是int 1发送的。我已经尝试了有和没有引号围绕1.引用代码运行,但不是执行更新(没有返回错误)。如果我删除引号,应用程序崩溃。

query = bson_new ();
bson_oid_init_from_string (&oid, tribe_id);

query = BCON_NEW ("_id", BCON_OID(&oid), "folders.folder_id", folderPositionRaw,"folders.files", 
    "{",
        "$elemMatch",
            "{",
                "file", file,
            "}",
    "}");       

// Find the document
cursor = mongoc_collection_find (collection, MONGOC_QUERY_NONE, 0, 0, 0, query, NULL, NULL);

// update document
update = BCON_NEW ("$inc", 
    "{", 
        "folders.0.files.$.favorites.0.like","1",
    "}");

    str = bson_as_json (update, NULL);
    printf ("***-> %s <-***\n\n",str);

mongoc_collection_update (collection, MONGOC_UPDATE_NONE, query, update, NULL, &error);

1 个答案:

答案 0 :(得分:0)

发现了问题!

您不能使用标准int它必须是BCON_INT

update = BCON_NEW ("$inc", 
    "{", 
        "folders.0.files.$.favorites.0.like",BCON_INT32 (1),
    "}");

:)