javascript - 利用 Mongo 的 ES6 默认参数

标签 javascript node.js mongodb ecmascript-6

我想知道是否有一种方法可以构建 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 查询以便它忽略空值。

最佳答案

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

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

The question is not how to organize/write my function but how to use es6 features to write a cleaner code that would work with mongo. I.E if the user didn't pass anything I want to return all the styles but mongo actually looks for empty fields so it doesn't return anything.

在我看来,您想要默认参数(也许总体默认值除外)。相反,您希望自动构建传递 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 即可轻松构建一次 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});

<小时/>

旁注:默认值不必是字符串,因此如果您使用数字表示年份而不是字符串,则默认值将只是-1,而不是'-1'

关于javascript - 利用 Mongo 的 ES6 默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45200417/

相关文章:

javascript - 将 JSON 对象发送到客户端时,响应中未定义值 - Node.js

javascript - 在 vanilla JavaScript 中向服务器发送 GET 请求的最佳方式是什么?

node.js - 模型中的 Mongoose 模型未定义

javascript - Nodejs将服务器数据传递给套接字?

javascript - 使用 CSP 在 Web Worker 中启用 'new Function'

javascript - 根据输入类型显示/隐藏 div 组= "number"

javascript - 如何从 Dijit FilteringSelect 小部件中删除所有选项?

javascript - Django:自动更新下拉菜单导致 "form.is_valid()"返回 false

javascript - 套接字IO |为客户分配角色的最佳方法是什么

javascript - Mongoose 不返回空对象的属性