You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:16:30