【问题标题】:Taking advantage of ES6 default parameters with Mongo在 Mongo 中利用 ES6 默认参数
【发布时间】:2017-07-19 20:28:27
【问题描述】:

我想知道是否有一种方法可以构造 mongo 的查询以利用 es6 默认参数。我有以下方法。如果未指定品牌、型号和年份,我想返回所有数据。我正在尝试找到一个优雅的解决方案,但到目前为止我所能想到的都是手动的。

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

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

【问题讨论】:

  • 呃,.find({ 'make.niceName': (make||""), ...
  • 不是和默认参数一样吗。
  • @adeneo & Yasin:不,这与默认参数不同。
  • getStyles是你自己的方法吗?你打算在那里进行解构吗?
  • @T.J.Crowder - 我知道,这是一个有点优雅的解决方案的建议

标签: javascript node.js mongodb ecmascript-6


【解决方案1】:

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

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

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

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

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

function getStyles(options = {}) {

...然后基于options 构建您的find 选项:

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) 映射到您需要的名称 find (make.niceName) 并不像附加 .niceName 那样简单,那么拥有一个 @987654337 就足够简单了@(或只是对象)您构建一次:

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'

【讨论】:

  • 很抱歉给您带来了困惑。我确实打算使用带有默认值的解构。问题不在于如何组织/编写我的函数,而是如何使用 es6 功能编写更简洁的代码,以便与 mongo 一起使用。即,如果用户没有传递任何我想返回的所有样式,但 mongo 实际上会查找空字段,因此它不会返回任何内容。
  • 我知道我可以使用整数但选择不使用,以使其与实际数据保持一致。年份字段将始终是一个字符串。
  • 如果你传递一个空字符串,Mongo 会寻找一个空字符串。如果要返回所有匹配项,则将该键/值对排除在查询之外。
  • @YasinYaqoobi:听起来你想要默认参数。 :-) 我已经更新了答案。
猜你喜欢
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 2016-12-21
  • 2017-04-01
  • 2015-12-19
相关资源
最近更新 更多