使用MongoC驱动查询含空对象字段的MongoDB文档无法命中如何解决
MongoDB C驱动查询空对象字段解决方案
查询失败的核心原因是类型不匹配:你使用BSON_APPEND_UTF8将查询条件的autoServSettings字段赋值为空字符串,而目标文档中该字段是空BSON文档(即空对象{}),MongoDB的字段匹配是严格校验类型的,二者类型不一致自然无法命中。
构造查询条件时需要显式传入空的内嵌文档作为匹配值,修改后的代码如下:
mongoc_collection_t* collection = mongoc_client_get_collection(client, "db_name", "collection_name"); bson_t* query = bson_new(); // 构造空对象作为查询匹配值 bson_t empty_doc; BSON_APPEND_DOCUMENT_START(query, "autoServSettings", &empty_doc); BSON_APPEND_DOCUMENT_END(query, &empty_doc); mongoc_cursor_t* cursor = mongoc_collection_find_with_opts(collection, query, NULL, NULL); const bson_t* doc; if (mongoc_cursor_next(cursor, &doc)) { // 匹配到包含空对象autoServSettings的文档 } // 用完释放资源避免内存泄漏 mongoc_cursor_destroy(cursor); bson_destroy(query); mongoc_collection_destroy(collection);
该查询条件会精准匹配autoServSettings字段值为{}的文档,不会误匹配字段不存在、字段值为null、字段值为空字符串的场景。如果需要同时匹配字段不存在的场景,可额外增加$exists判断逻辑。
内容的提问来源于stack exchange,提问作者Tony Nelson
相关产品推荐
相关产品推荐

