我想知道是否有一种方法可以构建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查询,以便忽略空值。
答案 0 :(得分:1)
假设getStyles
是您自己的方法,当然,您可以提供make
,model
和year
默认值。您还可以为要解构的整个对象提供默认值,这样调用者就不必传递任何:
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
)映射到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});
旁注:默认值不必是字符串,因此如果您使用year
而非字符串的数字,则默认值为-1
,而不是'-1'
。