为何触发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
相关产品推荐
相关产品推荐

