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

为何触发BadValue错误?已确认query_vector为数组仍报错

问题排查:MongoDB Cosmos Search 向量查询报错"value must be of type array"

执行以下Python代码时,始终触发错误:

{'ok': 0.0, 'errmsg': 'value must be of type array', 'code': 2, 'codeName': 'BadValue'}

已确认query_vector是100维浮点数组,但执行results = list(self.collection.aggregate(pipeline))时仍报错,代码如下:

def _get_relevant_documents(self, query: str) -> List[Document]:
    query_vector = self.embedding_model.embed_query(query)
    print("query_vector",type(query_vector))
    if hasattr(query_vector, "tolist"):
        query_vector = query_vector.tolist()
    print("query_vector2",type(query_vector))
    query_vector1 = [float(x) for x in query_vector]
    query_vector = query_vector1[:100]
    cosmos_search_stage = {
        "$search": {
            "cosmosSearch": {
                "vector": {
                    "path": "embedding",
                    "queryVector": query_vector,
                    "k": self.top_k,
                    "similarity": "COS"
                }
            }
        }
    }

    if self.keyword:
        cosmos_search_stage["$search"]["cosmosSearch"]["text"] = {
            "path": "description",
            "query": self.keyword
        }

    pipeline = [cosmos_search_stage]
    results = list(self.collection.aggregate(pipeline))

可能的报错原因及解决方法

1. 搜索阶段的结构层级错误

代码在添加关键词搜索时,错误地将text字段嵌套在了cosmosSearch内部,但MongoDB Cosmos Search的语法要求:$search下的cosmosSearch(向量搜索)和text(文本搜索)是同级字段,不能互相嵌套。

这种结构错误会导致MongoDB无法正确解析整个搜索请求,进而抛出类型误判的错误。

正确的结构应为:

"$search": {
    "cosmosSearch": {
        "vector": {...}
    },
    "text": {...}  # text与cosmosSearch同级
}

2. 验证query_vector的实际内容

虽然打印了类型,但建议直接输出query_vector的具体值,确认:

  • 数组内无非法元素(如None、字符串等)
  • 数组长度确实为100,且所有元素都是合法浮点数

可添加以下代码验证:

print("query_vector content:", query_vector)
print("vector length:", len(query_vector))

3. 检查集合的向量索引定义

确保集合上创建的向量索引中,path指定的embedding字段确实是数组类型,且维度与query_vector一致(100维)。索引维度与查询向量不匹配时,也可能触发类型相关的错误提示。

修正后的代码示例

def _get_relevant_documents(self, query: str) -> List[Document]:
    query_vector = self.embedding_model.embed_query(query)
    if hasattr(query_vector, "tolist"):
        query_vector = query_vector.tolist()
    # 合并切片与类型转换,简化代码
    query_vector = [float(x) for x in query_vector[:100]]

    cosmos_search_stage = {
        "$search": {
            "cosmosSearch": {
                "vector": {
                    "path": "embedding",
                    "queryVector": query_vector,
                    "k": self.top_k,
                    "similarity": "COS"
                }
            }
        }
    }

    if self.keyword:
        # 将text搜索放在$search下,与cosmosSearch同级
        cosmos_search_stage["$search"]["text"] = {
            "path": "description",
            "query": self.keyword
        }

    pipeline = [cosmos_search_stage]
    results = list(self.collection.aggregate(pipeline))

内容的提问来源于stack exchange,提问作者user23525

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:29:50