gpt4 book ai didi

javascript - 利用 Mongo 的 ES6 默认参数

转载 作者:行者123 更新时间:2023-12-03 03:50:17 25 4
gpt4 key购买 nike

我想知道是否有一种方法可以构建 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com