Возможно ли добавить фильтрацию к моему mongodb при использовании find () в экспресс-маршрутизации?и как? - PullRequest
0 голосов
/ 05 июня 2018

Здравствуйте, у меня есть эта функция GET, которая использует async, которая находит конкретную схему mongoose "Category", которую пользователь только что щелкнул, и другую схему mongoose "Tool" (которая просто находит все инструменты в моей базе данных) и переносит их обоих в визуализированныйстр.

Я бродил, если есть способ добавить какую-то фильтрацию в мой Tool.find, чтобы он нашел, например, только те инструменты, которые имеют такую ​​же категорию свойств (Tool.category), что и Категория (Category).имя) пользователь только что нажал?

функция GET:

router.get("/catalog/:id", function (req, res, next) {
    let output = {
            category: [],
            tools: []
    };
    async.parallel([
            function (cb) {
                    Category.findById(req.params.id).exec(function (err, foundCategory) {
                            if (err || !foundCategory) {
                                    req.flash("error", "No category found.");
                                    return res.redirect("back");
                            } else {
                                    output.category = foundCategory;
                                    cb(null, foundCategory);
                            }
                    });
            },
            function (cb) {
                    Tool.find({}, function (err, foundTools) {
                            if (err || !foundTools) {
                                    req.flash("error", "No tools were found.");
                                    return res.redirect("back");
                            } else {
                                    output.tools = foundTools;
                                    cb(null, foundTools);
                            }
                    });
            }
    ], function done(err, results) {
            if (err) {
                    res.json(err.message);
            } else {
                    res.render("tools/catalog-items", {
                            category: output.category,
                            tools: output.tools
                    });
            }
    });

});

1 Ответ

0 голосов
/ 05 июня 2018

Вы определенно можете сделать это.Чего вы хотите добиться - это сделать второй запрос зависимым от результатов первого.

В этом случае async.parallel не будет работать, так как вам нужно сначала получить результат Category.findById.

Если у вас будет несколько (более 2) последующих запросов, я бы предложил вам метод async.waterfall.Вы можете увидеть документы здесь .

Но для этого конкретного случая вы можете пойти так просто:

Category.findById(req.params.id, function (err, foundCategory) {
    if (err || !foundCategory) {
        req.flash("error", "No category found.");
        return res.redirect("back");
    }

    Tools.find({
        // As described in the question we filter by a `name` field
        // although in future you might consider creating an ObjectId reference
        category: foundCategory.name
    }, function (err, foundTools) {

        // As we applied filtering we might return an empty array of tools
        // instead of throwing an error
        if (err || !foundTools) {
            req.flash("error", "No tools were found.");
            return res.redirect("back");
        }

        res.render("tools/catalog-items", {
            category: foundCategory,
            tools: foundTools
        });
    });
});

Вы также можете выполнить сортировку.Вам просто нужно добавить .sort({someProperty: 1}).exec(...).Смотрите примеры здесь .

...