MongoDB/Mongoose查询生成器

c9x0cxw0  于 2022-11-22  发布在  Go
关注(0)|答案(2)|浏览(156)

我正在尝试建立一个查询生成器,它将允许我根据用户输入的参数过滤数据。我的数据模型是这样的:

{
"_id": {
    "$oid": "871287215784812"
},
"tags": [
    "school",
    "book",
    "bag",
    "headphone",
    "appliance"
],

"consultingDays": 57,
"client": "someOne",
"subSector": "something",
"region": "UK",
"__v": 0
}

目前,我的查询构建器如下所示:

app.post('/user/test',function(req, res) {

var query = {};

//QUERY NO.1 - This works perfectly
if (req.body.region){
    query.region = req.body.region
    console.log(query.region)
}

// QUERY NO.2 - This works perfectly  
if (req.body.subSector){
    query.subSector = req.body.subSector
}

Project.find(query, function(err, project){
    if (err){
        res.send(err);
    }
    console.log(project);
    res.json(project);
});
});

我的问题:

我想创建一个查询,它将从用户那里获取输入,解析“tags”数组并返回所需的JSON。
例如:
如果用户请求一个包含**“school”,“book”,“bag”的对象,它将返回上面我的数据模型所示的对象。但是如果用户请求一个包含“school”,“book”,“ninja Warrior”**的对象,它将不会返回任何数据,因为数据库中没有包含所有这3个字符串的对象。

我尝试过的方法:

我已经尝试了以下方法

if (req.body.sol){
    query.solutions = {"tags" : {$in: [req.body.sol]}} 
}

if (req.body.sol){
    query.solutions = {$elemMatch:{tags: req.body.sol}}
}

if (req.body.sol){
    query.solutions = { tags: { $all: [req.body.sol]}}
}

请求是这样发送的,它们返回一个空数组:

  • 此外,问题是用户将获得下拉选项。例如,他/她可能会获得3个下拉框。每个下拉框将显示标签数组中的所有五个选项。用户将为每个下拉框选择一个值。然后筛选结果。因为数据库中可能存在包含“book”、“bag”、“shoes”。用户可以在tags数组中选择这五个关键字的任意组合 *

有谁知道我该怎么解决这个问题吗?

huwehgph

huwehgph1#

你需要以sol的形式发送一个数组,所以在Postman中你应该将sol改为sol[0]sol[1]等。然后使用以下代码:

if (req.body.sol){
    query.solutions = {"tags" : {$in: req.body.sol}} 
}

没有[],因为req.body.sol是一个数组。

s2j5cfk0

s2j5cfk02#

我已经为嵌套对象实现了一个简单的查询构建:

const checkObject = (object) => {
  let key;

  const status = Object.entries(object).some(([objectKey, objectValue]) => {
    if (typeof objectValue === "object" && objectValue !== null) {
      key = objectKey;

      return true;
    }

    return false;
  });

  return { status, key };
};

const queryBuilder = (input) => {
  // Array verification not implemented
  let output = {};

  _.each(input, (value, key) => {
    if (typeof value === "object" && value !== null) {
      _.each(value, (nestedValue, nestedKey) => {
        output[`${[key, nestedKey].join(".")}`] = nestedValue;
      });
    } else {
      output[key] = value;
    }
  });

  const cacheCheckObject = checkObject(output);

  if (cacheCheckObject.status)
    return { ..._.omit(output, cacheCheckObject.key), ...queryBuilder(output) };

  return output;
};

我还没有实现数组,但是通过一些小的工作你就可以实现它。Mongo操作符也是一样。完整的例子可以在Gist上看到。

相关问题