利用Mongo的ES6默认参数

时间:2017-07-19 20:28:27

标签: javascript node.js mongodb ecmascript-6

我想知道是否有一种方法可以构建mongo的查询以利用es6默认参数。我有以下方法。如果未指定make,model和year,我想返回所有数据。我试图找到一个优雅的解决方案,但到目前为止,我能想到的只是手动,否则。

getStyles({ make = '', model = '', year = '-1' }) {
        return this.db
            .collection('styles')
            .find({ 'make.niceName': make, 'model.niceName': model, 'year.year': parseInt(year) })
            .toArray();
    }

注意: 这引起了一些混乱。我故意使用破坏。问题不在于如何编写这个函数。问题是如何构造一个mongo查询,以便忽略空值。

1 个答案:

答案 0 :(得分:1)

假设getStyles是您自己的方法,当然,您可以提供makemodelyear默认值。您还可以为要解构的整个对象提供默认值,这样调用者就不必传递任何

function getStyles({make = '', model = '', year = '-1'} = {}) {
// Overall default ------------------------------------^^^^^
    return // ...
}
  

问题不在于如何组织/编写我的函数,而是如何使用es6功能编写一个可以与mongo一起使用的更干净的代码。 I.E如果用户没有传递任何我希望返回所有样式的内容,但mongo实际上会查找空字段,因此它不会返回任何内容。

听起来像你想要默认参数(除了整体默认值)。相反,您希望自动化构建传递的对象的方式find

鉴于您的代码示例,您可以在对象上使用Object.keys轻松完成此操作。所以接受作为一个对象,例如:

function getStyles(options = {}) {

...然后根据find

构建您的options选项
const findParams = {};
Object.keys(options).forEach(key => {
  findParams[key + ".niceName"] = options[key];
});

实例:

function getStyles(options = {}) {
  const findParams = {};
  Object.keys(options).forEach(key => {
    findParams[key + ".niceName"] = options[key];
  });
  console.log(`find options: ${JSON.stringify(findParams)}`);
}

let results = getStyles({make: "Ford", model: "Mustang"});
results = getStyles({make: "Ford", model: "Mustang", year: 2017});

如果将您接受的名称(make)映射到findmake.niceName)所需的名称并不像添加.niceName那么简单,只需构建一次Map(或只是对象)就足够了:

const paramNames = new Map([
  ["make", "make.niceName"],
  ["model", "model.niceName"],
  ["year", "year.niceName"]
]);

...然后使用:

const findParams = {};
Object.keys(options).forEach(key => {
  const paramName = paramNames.get(key);
  if (paramName) {
    findParams[paramName] = options[key];
  }
});

实例:

const paramNames = new Map([
  ["make", "make.niceName"],
  ["model", "model.niceName"],
  ["year", "year.niceName"]
]);

function getStyles(options = {}) {
  const findParams = {};
  Object.keys(options).forEach(key => {
    const paramName = paramNames.get(key);
    if (paramName) {
      findParams[paramName] = options[key];
    }
  });
  console.log(`find options: ${JSON.stringify(findParams)}`);
}

let results = getStyles({make: "Ford", model: "Mustang"});
results = getStyles({make: "Ford", model: "Mustang", year: 2017});

旁注:默认值不必是字符串,因此如果您使用year而非字符串的数字,则默认值为-1,而不是'-1'