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 を通過しました/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);
DB チームから正しい Mongo 構文 (投稿の上部) を提供してもらいましたが、それを C BSON に構造化しようとして、何か間違ったことをしました。
いくつかの進歩:
コードを更新したところ、クラッシュしなくなりましたが、これは良い兆候ですが、Mongo に送信される出力 JSON が完全に正しく構造化されていません。問題は、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);