如何使用 Node-RED REST-API 按数字过滤
How to filter by numbers with Node-RED REST-API
我用 Node-RED 为我的 MongoDB 创建了一个小的 REST-API。
这很好用:<node-red-url>:<node-red-port>/rest/demo
显示所有条目。
我什至可以过滤结果:附加 ?userName=demo
仅显示 {userName: "demo"}
.
的条目
在我的数据库中,我有一些数字值。像 {weight: 10}
这样的东西。请注意,这不是 {weight: "10"}
!
现在我只想要 {weight: 10}
所在的条目。但是当我附加 ?weight=10
时,传输的参数将 10
转换为 "10"
。这没有命中,因为我所有的 weight
-值都是数字而不是字符串。
我能以某种方式更改附录以按 weight
过滤吗?还是我必须改进我的 REST 逻辑?
//编辑:
这就是我的流程:
[{"id":"c4a27b53.59303","type":"mongodb in","z":"99225255.0516b8","mongodb":"7e071505.7198bc","name":"","collection":"demo","operation":"find","x":660,"y":580,"wires":[["852d2853.264698"]]},{"id":"af5a916a.08366","type":"function","z":"99225255.0516b8","name":"parseQuery","func":"msg.payload = (msg.req.query);\n\nmsg.limit = 100;\nmsg.skip = 0;\n\nreturn msg;","outputs":1,"noerr":0,"x":330,"y":580,"wires":[["c4a27b53.59303"]]},{"id":"6b0b1b4b.eb8b2c","type":"http in","z":"99225255.0516b8","name":"","url":"/rest/demo","method":"get","swaggerDoc":"","x":120,"y":580,"wires":[["af5a916a.08366"]]},{"id":"852d2853.264698","type":"http response","z":"99225255.0516b8","name":"","x":950,"y":580,"wires":[]},{"id":"7e071505.7198bc","type":"mongodb","z":"","hostname":"192.168.100.166","port":"27017","db":"training","name":"debianTraining"}]
//编辑2:
更新
我用更多的服务器逻辑解决了这个问题:
if (msg.payload.hasOwnProperty('weight')) {
msg.payload.weight = parseInt(msg.payload.weight);
}
我又添加了两个案例来搜索 "greater than" 和 "lesser than":
if (msg.payload.hasOwnProperty('weightG')) {
msg.payload = {"weight": {$gt: parseInt(msg.payload.weightG)}};
delete msg.payload['weightG'];
}
if (msg.payload.hasOwnProperty('weightL')) {
msg.payload = {"weight": {$lt: parseInt(msg.payload.weightL)}};
delete msg.payload['weightL'];
}
目前为止一切正常。
好的,在查看了将 HTTP 查询转换为 Mongo 查询的函数节点之后,我认为没有什么好的方法可以动态地为 Mongo。
所有 HTTP 查询参数都将是字符串,因此如果您知道文档中的特定字段是数字,您可以只转换该字段。例如
msg.payload = (msg.req.query);
if (msg.payload.hasOwnProperty('weight')) {
msg.payload.weight = parseInt(msg.payload.weight)
}
msg.limit = 100;
msg.skip = 0;
return msg;
我用 Node-RED 为我的 MongoDB 创建了一个小的 REST-API。
这很好用:<node-red-url>:<node-red-port>/rest/demo
显示所有条目。
我什至可以过滤结果:附加 ?userName=demo
仅显示 {userName: "demo"}
.
在我的数据库中,我有一些数字值。像 {weight: 10}
这样的东西。请注意,这不是 {weight: "10"}
!
现在我只想要 {weight: 10}
所在的条目。但是当我附加 ?weight=10
时,传输的参数将 10
转换为 "10"
。这没有命中,因为我所有的 weight
-值都是数字而不是字符串。
我能以某种方式更改附录以按 weight
过滤吗?还是我必须改进我的 REST 逻辑?
//编辑: 这就是我的流程:
[{"id":"c4a27b53.59303","type":"mongodb in","z":"99225255.0516b8","mongodb":"7e071505.7198bc","name":"","collection":"demo","operation":"find","x":660,"y":580,"wires":[["852d2853.264698"]]},{"id":"af5a916a.08366","type":"function","z":"99225255.0516b8","name":"parseQuery","func":"msg.payload = (msg.req.query);\n\nmsg.limit = 100;\nmsg.skip = 0;\n\nreturn msg;","outputs":1,"noerr":0,"x":330,"y":580,"wires":[["c4a27b53.59303"]]},{"id":"6b0b1b4b.eb8b2c","type":"http in","z":"99225255.0516b8","name":"","url":"/rest/demo","method":"get","swaggerDoc":"","x":120,"y":580,"wires":[["af5a916a.08366"]]},{"id":"852d2853.264698","type":"http response","z":"99225255.0516b8","name":"","x":950,"y":580,"wires":[]},{"id":"7e071505.7198bc","type":"mongodb","z":"","hostname":"192.168.100.166","port":"27017","db":"training","name":"debianTraining"}]
//编辑2: 更新
我用更多的服务器逻辑解决了这个问题:
if (msg.payload.hasOwnProperty('weight')) {
msg.payload.weight = parseInt(msg.payload.weight);
}
我又添加了两个案例来搜索 "greater than" 和 "lesser than":
if (msg.payload.hasOwnProperty('weightG')) {
msg.payload = {"weight": {$gt: parseInt(msg.payload.weightG)}};
delete msg.payload['weightG'];
}
if (msg.payload.hasOwnProperty('weightL')) {
msg.payload = {"weight": {$lt: parseInt(msg.payload.weightL)}};
delete msg.payload['weightL'];
}
目前为止一切正常。
好的,在查看了将 HTTP 查询转换为 Mongo 查询的函数节点之后,我认为没有什么好的方法可以动态地为 Mongo。
所有 HTTP 查询参数都将是字符串,因此如果您知道文档中的特定字段是数字,您可以只转换该字段。例如
msg.payload = (msg.req.query);
if (msg.payload.hasOwnProperty('weight')) {
msg.payload.weight = parseInt(msg.payload.weight)
}
msg.limit = 100;
msg.skip = 0;
return msg;