Я пытаюсь преобразовать следующую команду 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);
Включили ли вы заголовок, объявляющий 'BSON_APPEND_UTF8'? – Biffen
Биффен, да извините, я не объяснил эту часть. Если я удалю вторую строку 'BSON_APPEND_UTF8', все будет работать. Так что это что-то с этой линией в том, как я структурировал вещи. –
Похоже, что компилятор считает, что первое вхождение является * объявлением *, а второе имеет другое количество аргументов, что предполагает отсутствие отсутствующего * фактического * объявления. Не могли бы вы показать нам что-то ближе к [MCVE]? – Biffen