使用ANSI C的mongoc库创建查询时触发断言失败求助
解决mongoc中BCON_NEW触发的断言错误
ctx->n != 0 这个断言错误src/bson/bcon.c:807: bcon_append_ctx_va: Assertion ctx->n != 0' failed通常是因为你使用BCON_NEW构建BSON文档时,**语法格式不匹配**——比如键值对没有正确配对、括号({/}或[/]`)没有闭合,或者参数顺序错误,导致BCON的上下文计数异常。
看你给出的代码片段,能发现几个明显的问题:
问题1:键名后面多了冒号
在BCON_NEW的语法里,键名是直接写字符串(不带冒号),然后紧跟着对应的值。你写的"road_segment:"带了冒号,这会被当成键名本身,后续的{会被当作这个键的值,但整体结构会因为键值对错位而混乱。
问题2:括号未正确闭合
你的代码片段末尾用...省略了内容,但从已有的部分看,你打开了多个{(road_segment的对象、$near的对象、$geometry的对象),但没有对应的}来闭合,这会导致BCON在解析时上下文计数出错,触发断言。
修正后的代码示例
下面是符合BCON语法的正确写法,你可以参考调整:
bool is_point_near_road(LOCATION_ITEM* item) { bson_error_t error; const bson_t *doc; char *str; bson_t *query; // 正确构建$near查询的BSON文档 query = BCON_NEW( "road_segment", "{", // 键名不带冒号,直接跟对象开始 "$near", "{", "$geometry", "{", "type", "Point", "coordinates", "[", BCON_DOUBLE(27.9478454), BCON_DOUBLE(65.6503487), "]", "}", // 闭合$geometry的对象 "}", // 闭合$near的对象 "}" // 闭合road_segment的对象 ); // 后续执行查询的逻辑,比如用mongoc_collection_find等 // ... // 记得用完后释放query,避免内存泄漏 bson_destroy(query); return true; // 根据实际业务逻辑调整返回值 }
额外注意事项
BCON_NEW的核心规则是键和值交替出现,对象用{开始、}结束;数组用[开始、]结束,每一层的括号必须严格配对。- 如果需要添加额外查询条件(比如限制最大距离),可以在
$near的对象内继续补充键值对,示例:"$near", "{", "$geometry", "{", ... "}", "$maxDistance", BCON_INT32(1000), // 限制搜索范围为1000米内 "}" - 所有通过
BCON_NEW创建的bson_t对象,用完后必须用bson_destroy()释放,防止内存泄漏。
内容的提问来源于stack exchange,提问作者ah laht
相关产品推荐
相关产品推荐

