Mon goose использовать пользовательский ввод для поиска результатов в БД с express. js? - PullRequest
0 голосов
/ 25 февраля 2020

Я новичок в мангусте / мон go и express, так что я не уверен, как go об этом. Поэтому я пытаюсь использовать чекбоксы для сортировки результатов фильтрации в моей базе данных.

Вот пример чего-то в моей базе данных:

{ "location" : "PHARMACY",
"region" : "SOCAL",
"system" : "WITS",
"contact" : "SMITH",
"membership" : "TIER1" }

Пока у меня есть только выяснил, как жестко запрограммировать его следующим образом, где я делаю Environment.find({region: "SOCAL"}), и он выплевывает все записи БД, содержащие SOCAL в качестве региона:

var express = require("express"),
  app = express(),
  mongoose = require("mongoose"),
  bodyParser = require("body-parser");

mongoose.connect("mongodb://localhost/epims", {
  useNewUrlParser: true,
  useUnifiedTopology: true
});
app.use(bodyParser.urlencoded({ extended: true }));
app.set("view engine", "ejs");

//schema setup
var environmentSchema = new mongoose.Schema({
  name: String,
  region: String,
  system: String,
  contact: String,
  membership: String,
});

var Environment = mongoose.model("Environment", environmentSchema);

app.get("/environments/show", function(req, res) {
  //find environment with selected parameters
  Environment.find({region: "SOCAL"}, function(err, foundEnvironment) {
    if (err) {
      console.log(err);
    } else {
      //render show template with that env
      res.render("show", { environment: foundEnvironment });
    }
  });
});

Как мне сделать так, чтобы этот поиск через изменения базы данных в зависимости от того, какой выбор сделан?

Вот моя форма выбора, если кому-то тоже нужно это увидеть

<form action="/environments" method="GET">
    <legend>Locations</legend>
    <input type="checkbox" name="location" value="PHARMACY">
    <label for="PHARMACY">PHARMACY</label>

    <input type="checkbox" name="location" value="OFFICE">
    <label for="OFFICE">OFFICE</label>

    <input type="checkbox" name="location" value="STORE">
    <label for="STORE">STORE</label>

    <legend>Regions</legend>
    <input type="checkbox" name="region" value="SOCAL">
    <label for="SOCAL">SOCAL</label>

    <input type="checkbox" name="region" value="NORCAL">
    <label for="NORCAL">NORCAL</label>

    <input type="checkbox" name="region" value="WA">
    <label for="WA">WA</label>

    ...
<a href="/environments/show">Submit</a>
</form>

1 Ответ

2 голосов
/ 26 февраля 2020

Параметры поиска можно передать с помощью поискового запроса: /environments/show?location=OFFICE&location=STORE&region=SOCAL&region=NORCAL

Запрос GET создает запрос к этой базе данных:

{ 
  region: { '$in': [ 'SOCAL', 'NORCAL' ] },
  location: { '$in': [ 'OFFICE', 'STORE' ] } 
}

app.get("/environments/show", function (req, res) {

     let region = [req.query.region || []].flat();
let location = [req.query.location || []].flat();


let query = {
    region: {
        "$in": region
    },
    location: {
        "$in": location
    }
};



    Environment.find(query, function (err, foundEnvironment) {
        if (err) {
            console.log(err);
        } else {
            //render show template with that env
            res.render("show", { environment: foundEnvironment });
        }
    });

});
<form action="/environments/show" method="GET">
    <legend>Locations</legend>
    <input type="checkbox" name="location" value="PHARMACY">
    <label for="PHARMACY">PHARMACY</label>

    <input type="checkbox" name="location" value="OFFICE">
    <label for="OFFICE">OFFICE</label>

    <input type="checkbox" name="location" value="STORE">
    <label for="STORE">STORE</label>

    <legend>Regions</legend>
    <input type="checkbox" name="region" value="SOCAL">
    <label for="SOCAL">SOCAL</label>

    <input type="checkbox" name="region" value="NORCAL">
    <label for="NORCAL">NORCAL</label>

    <input type="checkbox" name="region" value="WA">
    <label for="WA">WA</label>

    ...
    <button type="submit">Submit</button>
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...