Azure Cosmos DB MongoDB API $text命令支持版本及替代方案咨询
问题1:支持$text命令的Azure Cosmos DB MongoDB API版本
- Azure Cosmos DB MongoDB API 4.0及以上版本才正式支持
$text全文本搜索操作符,你当前使用的3.5.9版本属于旧版本,原生不支持该命令,所以会返回CommandNotSupported错误。如果要使用$text功能,你需要先将你的Cosmos DB账户的MongoDB API版本升级到4.0或更高版本。
问题2:3.5.9版本下使用$regex实现同等文本搜索的方案
可以通过$regex结合聚合管道的$match实现部分/全字段的文本搜索,具体操作分两种场景:
场景1:单字段模糊搜索
直接在find查询中使用$regex即可,示例代码如下:
// 搜索fieldName字段包含test的文档,i表示不区分大小写 db.db(config.mongodb.dbname).collection(collectionname) .find({ fieldName: { $regex: "test", $options: "i" } }) .sort({ createdDate: -1 }) .limit(limit) .skip(skip) .toArray((err, res) => { console.log(res) });
注意:如果使用前缀匹配(比如
^test),可以给对应字段建普通索引提升查询性能;如果是任意位置包含的模糊匹配,数据量大时查询性能会有所下降。
场景2:全字段/多字段模糊搜索
使用聚合管道的$match搭配$or,对需要搜索的所有字段逐一配置$regex规则,示例代码如下:
db.db(config.mongodb.dbname).collection(collectionname) .aggregate([ { $match: { $or: [ // 把所有需要参与搜索的字段都列在这里 { field1: { $regex: "test", $options: "i" } }, { field2: { $regex: "test", $options: "i" } }, { field3: { $regex: "test", $options: "i" } } ] } }, { $sort: { createdDate: -1 } }, { $skip: skip }, { $limit: limit } ]).toArray((err, res) => { console.log(res) });
- 如果需要实现完全匹配关键词的效果,可以把
$regex的规则改成"^test$"即可。 - 如果你的文档字段是动态不固定的,可以先查询单条样例文档获取所有字段名,再动态拼接
$or里的规则即可。
内容的提问来源于stack exchange,提问作者s d
相关产品推荐
相关产品推荐

