MongoDB 3.6.5+mongodb-rest实现Like查询的REST请求转换问题
嘿,我刚好熟悉mongodb-rest的用法,来帮你搞定这个模糊查询转REST请求的问题!
你在Mongo命令行里用的db.collection.find({"name" : /Smith/})是MongoDB的正则字面量语法,但这种写法没法直接放到HTTP请求里——因为JSON格式不支持原生的正则字面量,而mongodb-rest是基于JSON来处理查询参数的。不过别担心,我们可以用MongoDB的$regex操作符来替代,这样就能顺利传递查询条件了。
具体实现方式
1. 转换查询条件格式
把原来的正则字面量/Smith/转换成JSON格式的$regex表达式:
{"name": {"$regex": "Smith"}}
如果需要大小写不敏感的查询,可以加上$options参数:
{"name": {"$regex": "smith", "$options": "i"}}
2. 通过GET请求发送查询
如果想用GET请求,需要把上面的JSON字符串进行URL编码(因为URL里不能直接包含{、"这类特殊字符),然后作为query参数传递。
举个例子,编码后的查询参数会变成:%7B%22name%22%3A%7B%22%24regex%22%3A%22Smith%22%7D%7D
最终的GET请求URL大概是这样:
GET http://your-server:port/your-collection?query=%7B%22name%22%3A%7B%22%24regex%22%3A%22Smith%22%7D%7D
用curl命令测试的话:
curl "http://your-server:port/your-collection?query=%7B%22name%22%3A%7B%22%24regex%22%3A%22Smith%22%7D%7D"
3. 通过POST请求发送查询(更推荐)
POST请求不需要URL编码,直接把查询JSON放在请求body里,更直观也不容易出错。
根据mongodb-rest的规则,通常可以把查询放在query字段里,请求示例如下:
请求方法:POST
请求路径:http://your-server:port/your-collection/find
请求头:Content-Type: application/json
请求body:
{"query": {"name": {"$regex": "Smith"}}}
用curl命令测试:
curl -X POST http://your-server:port/your-collection/find \ -H "Content-Type: application/json" \ -d '{"query": {"name": {"$regex": "Smith"}}}'
为什么不能直接用/Smith/?
因为JSON数据格式不支持像MongoDB shell那样的正则字面量语法,必须用MongoDB官方定义的$regex操作符来表示正则查询,这样mongodb-rest才能正确解析并转换成MongoDB能识别的查询条件。
内容的提问来源于stack exchange,提问作者Spindoctor

