1

名前の一意性を保証するために mongodb _id 属性を使用したいと考えています。

mongo_cursor_init( cursor, &conn, &database );
bson_iterator iterator[1];

bson_find( iterator, mongo_cursor_bson( cursor ), "name" );
const char *filename = bson_iterator_string( iterator );

bson_find( iterator, mongo_cursor_bson( cursor ), "_id" );
const char *mongoid = bson_iterator_string(iterator);

char name[255];
strcpy(name,filename);
strcat(name,".");
strcat(name,mongoid);

ただし、変数 mongoid は正しく入力されません (まったく...)。_id のデータ型を見つける方法がわかりません。誰もこれをやったことがありますか?ありがとう!

編集:答えはここにあると思いますが、わかりません...

4

3 に答える 3

4

これが誰かに役立つことを願っています...

Mongo _idから文字列:

char mongoid[25];
bson_find( iterator, mongo_cursor_bson( cursor ), "_id" );
bson_oid_t *oid = bson_iterator_oid( iterator );
bson_oid_to_string(oid,mongoid);

Mongo _idへの文字列:

bson_oid_t new_oid;
bson_oid_from_string(&new_oid,mongoid);
于 2012-07-16T21:56:51.580 に答える
1

--oidbson_iterator_oid()は ObjectId 用です。

そこからバイトを取得し、(未テスト) のようなループを使用してそれらを 16 進数に変換できます。

bson_find( iterator, mongo_cursor_bson( cursor ), "_id" );
bson_oid_t *oid = bson_iterator_oid( iterator );

char mongoid[25];
for(int i = 0; i < 12; i++)
{
  snprintf( mongoid, 2, "%02X", oid->bytes[i] );
}

また、妥当な最大値で と を使用することを検討してください。名前フィールドの長さが 300 文字の場合、ここで予期しない動作が発生する可能性がありますstrncpystrncat

于 2012-07-13T06:51:54.500 に答える
0

十分な評判ポイントがあれば、@ jacobra回答にこのコメントを追加して、コードを機能させたでしょう。

char mongoid[25];
bson_find( iterator, mongo_cursor_bson( cursor ), "_id" ); // not sure if this function actually exists or the user referred to bson_iter_find
const bson_oid_t *oid = bson_iterator_oid( iterator );
bson_oid_to_string(oid,mongoid);

前に const キーワードを追加しました bson_oid_t *oid = bson_iterator_oid( iterator );

関数「bson_find」を見つけることができなかったことにも言及する価値があります。次のようなものを使用できます。

bson_iter_t         Iterator; // to loop over the bson document 
if (!bson_iter_init(&Iterator, Document.GetDocumentStr())) // your document
        return;
while (bson_iter_next(&Iterator)) {
if (BSON_ITER_HOLDS_OID(&Iterator) && strcmp(Key, "_id") == 0)
// our key is the _id
        {       
            const bson_oid_t *oid = bson_iter_oid(&Iterator);
            bson_oid_to_string(oid, Data.Id);
        }
}

便利なリンク:

于 2020-09-03T13:59:32.260 に答える