首页 > 解决方案 > 如何查询mongodb

问题描述

我得到了这段代码,我想从模型中返回所有产品并通过查询对它们进行排序;路由后面的查询// ?sortBy=sold&order=desc&limit=100&skip=5

而我用于路由的控制器,我知道我一定做错了什么:

exports.menBySell = async (req, res, next) => {
  let order = req.query.order ? req.query.order : "asc";
  let sortBy = req.query.sortBy ? req.query.sortBy : "_id";
  let limit = req.query.limit ? parseInt(req.query.limit) : 100;

  try {
    const menBySell = await Men.find()
      .populate("color")
      .populate("brand")
      .sort([[sortBy, order]])
      .limit(limit)
      .exec(articles);
    return res.json(articles);
  } catch (err) {
    if (!err.statusCode) {
      err.statusCode = 500;
    }
    next(err);
  }
};

标签: node.jsmongodb

解决方案


您可以添加如下函数,该函数从您的查询字符串接收过滤器对象:

  const parseQueryFilter = (filter) => {
    if (!filter) {
        return {options: null, newFilter: {}};
    }
    let options = null, newFilter = Object.assign({}, filter);
    Object.keys(newFilter).forEach((k) => {
        try {
            if (k === 'sortBy') {
                console.log(filter[k]);
                options = {sort: JSON.parse(filter[k])};
                delete newFilter[k];
            } else {
                console.log(filter[k]);
                newFilter[k] = JSON.parse(filter[k]);
            }
        } catch (e) {
        }
    });
    return {options, newFilter};
};

然后,您使用此函数将过滤器作为参数传递,它将检索选项对象(其中将包含“sortBy”查询字符串中的选项和包含查询字符串中其他参数的 newFilter 对象。

let {options, newFilter} = parseQueryFilter(filter);
return Men.find(newFilter, null, options);

推荐阅读