根据用户指定的过滤器仅返回用户指定的列

时间:2018-10-12 19:35:24

标签: javascript node.js mongodb express mongoose

我对JavaScript绝对陌生,并且对以下内容有所了解。

环境是node.js,express,mongodb,mongoose。

说,数据库/集合包含1000行,每行有50列。对于某些列,一行可能具有空值。

用户可以输入某些过滤器-例如,第10、20列-{'fruit':'apple','price':'$ 20'}。基于这些过滤器,选择行。但是,当响应到达用户时,不会显示所有列(其中50列)。用户可以选择列,仅显示那些列。例如,用户发送的请求带有上面的过滤器,并且column_selected为5、9、21、40。过滤器的最大数量为7(例如,用户可以选择7个中的1个)和任意数量的列(可能是1,可能全部是50)。该请求必须作为“发布”请求发送。我得到了以下代码(针对columns_selected),但它不返回任何数据。我写了代码的“过滤器”部分,但也不起作用。我也包括了一个示例请求对象。任何帮助将不胜感激。刚接触过JS,我什至没有正确的方向来解决这个问题。

请求对象:

请求对象:

{
               "filters": {
                               "a": "b",
                               "c": "d",
                               "3": "abc",
                               "d": "r"
               },
               "column_selected": ["a",
                               "ab",
                               "sw",
                               "ff",
                               "gg"
               ],
               "view_name": "my_view"
}

响应对象:

Response_object:

{
               "user_views": [{
                                              "filters": {
                               "a": "b",
                               "c": "d",
                               "3": "abc",
                               "d": "r"
               },

                                               "column_selected": ["a",
                               "ab",
                               "sw",
                               "ff",
                               "gg"],
                                               "view_name": "my_view"
                               },
{
                                               "filters": {
                                   "a": "b",
                                   "c": "d",
                                   "3": "abc",
                                   "d": "r"
                   },
                                               "column_selected": ["a",
                                   "ab",
                                   "sw",
                                   "ff",
                                   "gg"],
                                               "view_name": "my_view2"
                               }]}

针对column_selected的代码

const express = require("express");
const url = require("url");
const router = express.Router();
const Data = require("../../models/Data");
const numberOfRecords = 1000;

router.post("", (req, res) => {
  columnsSelected = req.body.columnSelected;
  console.log(columnsSelected);

  var reqColumns = {};
  for (each of columnsSelected) reqColumns[each] = 1;
  reqColumns["_id"] = 0;

  // Data.find(req.body.filters, reqColumns)
  Data.find({}, reqColumns)
    .skip(req.body.noRows * req.body.pageNumber)
    .limit(req.body.noRows)
    .then(data => {
      console.log("in success");
      return res.json({ data: data });
    })
    .catch(err => {
      console.log("in error");
      return res.send(err);
    });
});

module.exports = router;

过滤器代码

const express = require("express");
//const url = require("url");
//const router = express.Router();
const router = require('express').Router();
const Data = require("../../models/Data");
//const numberOfRecords = 1000;

router.get("/getData", function(req, res) {
var filtersSelected = req.body.filters;

  Data.collection('getData').find({}, filtersSelected)
    .then(data => {
      console.log("in success");
      return res.json({ data: data });
    })
    .catch(err => {
      console.log("in error");
      return res.send(err);
    });
}); 

1 个答案:

答案 0 :(得分:0)

借助@dnickless的上述注释解决了该问题。要记住的两个重要事项。 find函数采用两个参数-filtersprojection columns。发送的请求必须具有正确的格式-在我的情况下为application/json