2017-03-16 12 views
0

Ich habe eine kleine REST-API für meine MongoDB mit Node-RED erstellt.So filtern Sie nach Nummern mit Node-RED REST-API

Das funktioniert gut: <node-red-url>:<node-red-port>/rest/demo zeigt mir alle Einträge.

ich sogar das Ergebnis filtern: ?userName=demo Anfügen zeigt nur Einträge, bei denen {userName: "demo"}.

In meiner Datenbank habe ich einige Werte, die Zahlen sind. So etwas wie {weight: 10}. Beachten Sie, dass dies NICHT {weight: "10"} ist!

Jetzt möchte ich nur die Einträge wo {weight: 10}. Aber wenn ich anschließe ?weight=10 die übertragenen Parameter konvertieren 10 zu "10". Das hat keinen Treffer, da alle meine weight -Werte Zahlen und keine Zeichenfolgen sind.

Kann ich den Anhang irgendwie ändern, um nach weight zu filtern? Oder muss ich meine REST-Logik verfeinern?

// edit: Dies ist, was mein Flow wie folgt aussieht:

[{"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"}]

// edit2: UPDATE

Ich reparierte diese mit etwas mehr Server-Logik:

if (msg.payload.hasOwnProperty('weight')) { 
    msg.payload.weight = parseInt(msg.payload.weight); 
} 

Ich habe zwei weitere Fälle hinzugefügt, um nach "greate" zu suchen r als "und" kleiner als ":

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']; 
} 

Das funktioniert bis jetzt gut.

+1

Sie müssen uns hier wahrscheinlich mehr Informationen über Ihren Fluss geben. Ein Screenshot oder der exportierte Fluss, damit wir sehen können, was Sie bereits verdrahtet haben. – hardillb

+0

Ich habe gerade die Frage bearbeitet und den Fluss hinzugefügt – user2699453

Antwort

1

OK, nachdem ich den Funktionsknoten angeschaut habe, der die HTTP-Abfrage in die Mongo-Abfrage konvertiert, glaube ich nicht, dass es eine nette Möglichkeit gibt, dies dynamisch für ein beliebiges Objekt in Mongo zu tun.

Alle HTTP-Abfrageparameter werden Zeichenfolgen sein. Wenn Sie also ein bestimmtes Feld im Dokument kennen, das eine Zahl ist, können Sie nur dieses Feld konvertieren. z.B.

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; 
+0

danke! Also brauche ich mehr Serverlogik. – user2699453

+0

Ich habe noch eine Frage, gibt es eine Möglichkeit, für mehr als zu filtern? Etwas wie 'find ({$ gt: 30})' '? – user2699453

+0

Stellen Sie neue Fragen als neue Fragen – hardillb