Go Mongo driver用compound操作符实现带过滤的search autocomplete报错如何解决
错误原因
你遇到的报错是因为$search聚合阶段属于MongoDB Atlas Search的专属能力,该阶段下的所有查询语法必须使用Atlas Search支持的操作符,不能直接使用普通MongoDB查询的字段匹配写法。你原代码里compound.filter直接写"city": cityName不符合$search的语法规范,所以触发了报错。
修复后代码
filter := bson.A{ bson.M{ "$search": bson.M{ "compound": bson.M{ // filter子句使用Atlas Search的equals操作符做城市等值过滤 "filter": bson.A{ bson.M{ "equals": bson.M{ "path": "city", "value": cityName, }, }, }, // must子句推荐用数组包裹,兼容性更好 "must": bson.A{ bson.M{ "autocomplete": bson.M{ "query": searchQuery, "path": "email", "tokenOrder": "any", }, }, }, }, }, }, } cur, err := someCollection.Aggregate(ctx, filter)
注意事项
- 你需要提前在对应的集合上创建Atlas Search索引,索引配置中需要包含两个字段:
email字段的索引类型设置为autocomplete,且分词配置要和你查询的参数匹配city字段需要加入搜索索引,类型设置为对应的值类型(比如字符串)
- 如果后续需要加更多过滤条件,直接往
filter数组里追加对应的Atlas Search操作符即可
内容的提问来源于stack exchange,提问作者zer0
相关产品推荐
相关产品推荐

