2016-04-23 4 views
0

Я пытаюсь преобразовать следующую команду MongoDB JSON в корректный BSON с помощью драйвера Монго C:Монго: Ошибка преобразования 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: In function ‘main’:
/current/set_fav.c:102: warning: initialization discards qualifiers from pointer target type
/current/set_fav.c:168:122: error: macro "BSON_APPEND_UTF8" passed 9 arguments, but takes just 3
/current/set_fav.c:168: error: ‘BSON_APPEND_UTF8’ undeclared (first use in this function)
/current/set_fav.c:168: error: (Each undeclared identifier is reported only once /current/set_fav.c:168: error: for each function it appears in.)

FYI: 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); 

Я получил помощь от моей DB команды дает мне правильный синтаксис Монго (в верхней части поста) и в моей попытке структурировать, что в C BSON я сделал что-то не так.


Некоторый прогресс:

Я обновил свои коды, и они больше не крах, который является хорошим знаком, но вывод в формате JSON, который отправляется в Монго не полностью структурирован правильно. Я думаю, что проблема в том, что значение 1, отправленное в команде mongo $ inc, отправляется как скаляр 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); 
+0

Включили ли вы заголовок, объявляющий 'BSON_APPEND_UTF8'? – Biffen

+0

Биффен, да извините, я не объяснил эту часть. Если я удалю вторую строку 'BSON_APPEND_UTF8', все будет работать. Так что это что-то с этой линией в том, как я структурировал вещи. –

+0

Похоже, что компилятор считает, что первое вхождение является * объявлением *, а второе имеет другое количество аргументов, что предполагает отсутствие отсутствующего * фактического * объявления. Не могли бы вы показать нам что-то ближе к [MCVE]? – Biffen

ответ

0

Обнаружена проблема!

Вы не можете использовать стандартный int он должен быть BCON_INT

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

:)