具有两个MongoDB集合查询的ExpressJS路由

时间:2015-09-18 00:55:59

标签: node.js mongodb express mongoose routes

我目前有一个模型集合,它显示与模型中两个属性的查询匹配的所有文档。这两个属性显示在我的url路径中,并通过从路径中获取两个属性并显示与这些值匹配的文档来触发生成的路径。 e.x. color:' red',day:' monday',如果使用/ red / monday显示网址,则会显示包含这些值的所有文档(图像)。我当前的路由正确执行此查询。

我现在想要创建第二个集合,其中包含“颜色”和“颜色”的每种可能组合的描述。和'天。基本上当我去/ red / monday时,会显示图像,然后会出现描述。

我不确定在路由中的一个查询中加入这两种组合的最佳方法。有什么帮助吗?

图片模型:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var imageSchema = new Schema({
    day: { type: String, enum: ['Monday', 'Tuesday', 'Wednesday'] },
    color: { type: String, enum: ['Black', 'Blue', 'White'] },
    imageName: String,
    imageUrl: String,
    imageSource: String
});

var Images = mongoose.model('Images', imageSchema);

module.exports = Images;

描述模型:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var descriptionSchema = new Schema({
    pattern: { type: String, enum: ['Monday', 'Tuesday', 'Wednesday'] },
    color: { type: String, enum: ['Black', 'Blue', 'White'] },
    body: String,
});

var Description = mongoose.model('Description', descriptionSchema);

module.exports = Description;

当前路由:

var express = require('express');
var router  = express.Router();
var Images = require('./models/imagesModel');
var Description = require('./models/descriptionModel');

    /*==== Color Pages  ====*/

    router.get('/:color/day-selection', function(req, res){

        console.log(req.params.color);

        res.render('pages/color.hbs', {
            color: req.params.pattern
        });
    });


    /*====  Results ====*/


    router.get('/:color/:day/result', function(req, res){

        console.log(req.params.color);

        Images.find( { pattern: req.params.color, color: req.params.day }, function(err, image){
            if (err) { console.log(err); }
            console.log(image);

            res.render('pages/result.hbs', {
                color   : req.params.color,
                day : req.params.day,
                image : image
            });
        });
    });

1 个答案:

答案 0 :(得分:1)

我会尝试让网址更加RESTful。

获取一天所有颜色的网址将类似于

route.get(':days') =>提供GET /mondays - >获取星期一的所有颜色列表。

route.get('/days') =>提供GET /days - >获取所有日子的列表

route.get(':days/:colors') =>提供GET /mondays/reds - >星期一得到红色的描述。

route.get(':day/:color/images') =>服务器GET /mondays/reds/images - >获取/mondays/reds/images

的所有图片

route.get(':days/:colors/images/:id') =>提供GET :days/:colors/images/:id =>在/mondays/reds/images/mongo-db-id - >上提供GET服务得到那个特定的图像

其他一些变化,

  1. 将服务层代码移出路由器并将其注入express()的实例。例如,阅读无耻插件, - https://github.com/swarajgiri/express-bootstrap/blob/master/bootstrap/app.js#L86
  2. 将数据库连接作为参数传递给服务层。 https://github.com/swarajgiri/express-bootstrap/blob/master/core/index.js
  3. (可选) - 使用promises和generator进行流量控制。前 - https://gist.github.com/swarajgiri/16202e32aa4d80d45c62