0

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);
4

1 に答える 1

0

問題を発見!

intBCON_INT でなければならない標準は使用できません

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

:)

于 2016-04-24T19:30:27.403 に答える