MONGOC_DATABASE_COMMAND(3)

πŸ’… MONGOC_DATABASE_COMMAND(3) β€” bestie edition ✨

okay so before we even get into it β€” this one lives in libmongoc, and it's the database-level command cursor thing. Sit down, hydrate, let's go 🫢


⚠️ WARNING β€” Deprecated since version 1.29.0: This function is deprecated and should not be used in new code. Use mongoc_database_command_simple() instead.

Like, she still works, but she's on her way out. New code should NOT be caught using her. Periodt πŸ’€


✨ SYNOPSIS ✨

mongoc_cursor_t *
mongoc_database_command (mongoc_database_t *database,
                         mongoc_query_flags_t flags,
                         uint32_t skip,
                         uint32_t limit,
                         uint32_t batch_size,
                         const bson_t *command,
                         const bson_t *fields,
                         const mongoc_read_prefs_t *read_prefs);

πŸ¦‹ DESCRIPTION πŸ¦‹

So basically this function builds you a cursor that will actually run the command when you call mongoc_cursor_next() on it. Not before. It's giving "I'll do it when you ask me to" energy 😌

Important tea though: the database's read preference, read concern, and write concern are not applied to the command. And mongoc_cursor_next() will not check the server response for a write concern error or a write concern timeout. So don't come crying to her about write concern, she didn't sign up for that.

Also β€” this function is not considered a retryable read operation. No cap.


πŸŽ€ PARAMETERS πŸŽ€

  • database β€” A mongoc_database_t. The main character here obviously πŸ‘‘
  • flags β€” Unused. Literally just sitting there. Ignore her.
  • skip β€” Unused. Bestie, leave it alone.
  • limit β€” Unused. Don't even look at it.
  • batch_size β€” Unused. She's decorative, that's the vibe πŸ’…
  • command β€” A bson_t containing the command. This one actually matters ✨
  • fields β€” Unused. Just vibes.
  • read_prefs β€” An optional mongoc_read_prefs_t. If you don't pass one, the command uses mode MONGOC_READ_PRIMARY.

🌈 MIGRATING 🌈

mongoc_database_command() is deprecated. Yeah. So here's the glow-up tutorial, before-and-after style 😭

Here's the example that uses mongoc_database_command():

πŸ’€ Before

const bson_t *reply;
bson_t *cmd = BCON_NEW ("find", "foo", "filter", "{", "}");
mongoc_cursor_t *cursor = mongoc_database_command (db,
                                                   MONGOC_QUERY_NONE /* unused */,
                                                   0 /* unused */,
                                                   0 /* unused */,
                                                   0 /* unused */,
                                                   cmd,
                                                   NULL /* unused */,
                                                   NULL /* read prefs */);
// Expect cursor to return exactly one document for the command reply.
EXPECT (mongoc_cursor_next (cursor, &reply));

bson_error_t error;
if (mongoc_cursor_error (cursor, &error)) {
   FAIL ("Expected no error, got: %s\n", error.message);
}

// Expect successful reply to contain "ok": 1
bson_iter_t iter;
EXPECT (bson_iter_init_find (&iter, reply, "ok") && bson_iter_as_int64 (&iter) == 1);

// Expect cursor to return no other documents.
EXPECT (!mongoc_cursor_next (cursor, &reply));
mongoc_cursor_destroy (cursor);
bson_destroy (cmd);

The above code block may be rewritten to use mongoc_database_command_simple() instead, as shown below:

🌸 After

bson_t reply;
bson_error_t error;
bson_t *cmd = BCON_NEW ("find", "foo", "filter", "{", "}");
if (!mongoc_database_command_simple (db, cmd, NULL /* read prefs */, &reply, &error)) {
   FAIL ("Expected no error, got: %s\n", error.message);
}

// Expect successful reply to contain "ok": 1
bson_iter_t iter;
EXPECT (bson_iter_init_find (&iter, &reply, "ok") && bson_iter_as_int64 (&iter) == 1);

bson_destroy (&reply);
bson_destroy (cmd);

See? The glow-up is real. Same energy, way fewer unused params 🧚


πŸ’– RETURNS πŸ’–

This function returns a newly allocated mongoc_cursor_t that you should free with mongoc_cursor_destroy() when you're done with it β€” no leaving her on read, okay?

The returned mongoc_cursor_t is never NULL, even on error. That's right, even when everything's a mess she still shows up πŸ™ˆ

And the user must call mongoc_cursor_next() on the returned mongoc_cursor_t to execute the initial command. It doesn't run itself, bestie, that's on you.

Cursor errors can be checked with mongoc_cursor_error_document(). It always fills out the bson_error_t if an error occurred, and optionally includes a server reply document if the error occurred server-side. So thorough of her πŸ’…

⚠️ WARNING: Failure to handle the result of this function is a programming error. Like fr fr, handle your results. Don't be that girl.

🌟 AUTHOR 🌟

MongoDB, Inc


2009-present, MongoDB, Inc.


and that's the whole page, bestie! ✨ This was libmongoc version 1.30.13, dated Oct 09, 2026, and yeah β€” the man page said MONGOC_DATABASE_COMMAND(3) at the top and at the bottom, we said it twice, iconic behavior πŸ’…πŸ’–

πŸ“¦ where this page comes from