bson_error_t error;
bson_t *bson_search = bson_new_from_json (json, strlen(json), &error);
if (!bson_search)
{
log_fatal(error.message);
}
mongoc_cursor_t *cursor;
cursor = mongoc_collection_aggregate(client.collection, MONGOC_QUERY_NONE, bson_search, NULL, NULL);
int i = 0;
char *str;
const bson_t *doc;
while (mongoc_cursor_next (cursor, &doc))
{
str = bson_as_json (doc, NULL);
printf ("%s\n", str);
bson_free (str);
i++;
}
if (mongoc_cursor_error (cursor, &error))
{
fprintf (stderr, "Cursor Failure: %s\n", error.message);
}
mongoc_cursor_destroy (cursor);
bson_destroy (bson_search);
According to this page that documents the mongo_cursor_t,
https://mongoc.org/libmongoc/current/mongoc_cursor_t.html
the cursor is for an unknown number of documents. Is there an equivalent cursor or function call I can use to get the number of hits? I’d ultimately like to store the documents in a char* or concatenated as a single char*.
If there’s a way I can just get full raw json as a char*, that’s fine too (even preferred).
I can’t answer my original question of identifying the number of documents (which I think is a really bad API limitation), since I skimmed through the source code and it seems like the cursor is actually a linked list. However, I can reach my goal of getting the documents into a single char*.
Idea: Convert the search to a bson via an array of bson under { “documents” : [ array of objects ] }
If anyone has a cleaner solution or suggestions on how to simplify this, I would appreciate it.
mongoc_cursor_t *cursor;
cursor = mongoc_collection_aggregate(client.collection, MONGOC_QUERY_NONE, bson_search, NULL, NULL);
if (mongoc_cursor_error (cursor, &error))
{
log_fatal("Cursor Failure: %s", error.message);
}
// convert cursor (linked-list) to bson
int i = 0;
const bson_t *doc;
bson_array_builder_t *array_docs = bson_array_builder_new();
while (mongoc_cursor_next(cursor, &doc))
{
if (!bson_array_builder_append_document(array_docs, doc))
{
// Handle failure to concatenate
}
log_debug("%d", i);
i++;
}
bson_t documents;
bson_array_builder_build(array_docs, &documents);
bson_t * bson_out = bson_new();
bson_append_array(bson_out, "documents", -1, &documents);
// bson -> char* via copy
char *out = bson_as_json(bson_out, NULL);
// Free
mongoc_cursor_destroy (cursor);
bson_destroy (bson_search);
bson_destroy (documents);
bson_destroy(bson_out);
Thanks for the suggestion.