我想知道是否有一种方法可以构建 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
是你自己的方法,当然,你可以给make
、model
和year
默认值。您还可以为要解构的整个对象指定默认值,这样调用者就不必传递任何内容:
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/