猫鼬在哪里,我无法过滤阵列

时间:2018-08-13 20:24:58

标签: node.js mongoose where

这是我的模特

var boxSchema = new mongoose.Schema({
    name: String,
    link: String,
    mark: String,
    price: Number,
    format: Array,
});

路线

router.get('/', function(req, res) {

var where = {};

if(req.param('mark')) {
    where.mark= req.param('mark');
}

if(req.param('format')) {
    where.format = req.param('format');
}

var perPage = 9;
var page = parseInt(req.param('page')) || 1;

Box
    .find(where)
    .skip((perPage * page) - perPage)
    .limit(perPage)
    .exec(function(err, Boxs) {
        Box.count(where).exec(function(err, count) {
            if(err) {
                console.log(err);
                res.redirect('/');
            }

            var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;

            if(fullUrl.indexOf('?') == -1) {
                fullUrl = fullUrl + '?';
            }

            fullUrl = fullUrl.replace(/^.*\/\/[^\/]+/, '').replace('&page=' + page, '');

            res.render('./configurator/box/index', {
                Boxs: Boxs,
                current: page,
                pages: Math.ceil(count / perPage),
                URL: fullUrl
            });

        });
    });
});

Box可以具有以下格式:mITX,ATX,eATX,mATX,mITX,CEB,EEB,UCFF,Mini-STX。当然,一个盒子可以有更多的格式。

当我发送一种格式为http://localhost:3000/boxes?format=ATX的GET请求时。效果很好,因为我只收到具有ATX格式的盒子。

问题是当我想要显示具有ATX或CEB格式的框时。 (http://localhost:3000/boxes?format=ATX&format=+CEB)。我没有任何盒子。

1 个答案:

答案 0 :(得分:0)

好吧,因此首先您需要按如下所示将多个format值发送到服务器

http://localhost:3000/boxes?format=ATX&format=CEB

Express会将查询字符串值解析为一个数组,该数组可从req.query中访问

console.log(req.query.format);
// ['ATX', 'CEB']

现在有了过滤器参数,您可以使用$in运算符来构建mongo查询

const where = {};
if (req.query.format) {
    if (Array.isArray(req.query.format)) {
        where.format = {
            $in: req.query.format
        };
    } else {
        where.format = req.query.format;
    }
}