我需要一些帮助来开发搜索查询,以便为我的Electron应用程序中的按钮提供一些功能。
这是我所走的路:
module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
// write a query that will follow sort, offset, limit options only
// do not worry about criteria yet
Artist.sort()
.find()
.offset()
.limit();
};
我现在正在跳过criteria
,所以可以忽略它。用户应该能够按歌手姓名,年龄和发行的专辑进行排序。 sortProperty
将以升序方式显示,所以我知道我需要使用1
的值进行排序。
排序背后的真正挑战是我需要指定不同的sortProperties
,但在任何给定时间只能指定一个。
我希望能够根据用户选择的内容传递不同的sortProperty
。我想拥有一个sortProperty
是什么的密钥。
因此,如果sortProperty
等于年龄,我需要确保我有一条声明说年龄。
答案 0 :(得分:1)
看来您已经具有执行查询所需的所有部分。您只需要根据sort
创建sortProperty
选择器。这将是一个对象,其键等于sortProperty
所保存的值,例如age
。结果看起来像这样
module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
return Artist
.find()
.sort({ [sortProperty]: 1 })
.skip(offset)
.limit(limit);
};
为说明动态键分配,以下为代码段
const sortProperty = 'age';
const selector = { [sortProperty]: 1 };
console.log(selector);
答案 1 :(得分:0)
因此,以上答案是最佳解决方案,因为它是ES6,并且更美观。我想分享在获得答案并进行更深入研究之后学到的ES5老派方式。
通过ES5的方式,我了解到可以像这样定义一个对象:
module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
// write a query that will follow sort, offset, limit options only
// do not worry about criteria yet
const sortOrder = {};
Artist.find({})
.sort()
.skip(offset)
.limit(limit);
};
我将其制成一个空对象,然后看着它并添加sortProperty
等于1
,如下所示:
module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
// write a query that will follow sort, offset, limit options only
// do not worry about criteria yet
const sortOrder = {};
sortOrder[sortProperty] = 1;
Artist.find({})
.sort()
.skip(offset)
.limit(limit);
};
然后我可以像这样传递sortOrder
:
module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
// write a query that will follow sort, offset, limit options only
// do not worry about criteria yet
const sortOrder = {};
sortOrder[sortProperty] = 1;
Artist.find({})
.sort(sortOrder)
.skip(offset)
.limit(limit);
};
好的,如果有人对它感兴趣,那就是ES5方法,但是如您所见,ES6解决方案看起来更好。
在创建对象并同时向其添加属性时,整个问题是ES5对它的支持不佳,我们必须首先声明一个对象,然后向其添加一个属性并将该属性设置为1。
方括号表示sortProperty
变量:
sortOrder[sortProperty] = 1;
这是一个字符串,我尝试将sortOrder
的{{1}}属性添加到该对象,并将其设置为等于name
,因此如果在其中运行,则最终结果Chrome控制台或代码段中为1
。
对我来说,学习曲线以及所选答案可以帮助我学习的是ES6内插属性或键。这个东西:
{ name: 1 }
这里发生的事情是在运行时查看.sort({ [sortProperty]: 1 })
变量及其等同值,然后将该属性添加到该对象中并为其指定值sortProperty
。
很明显,是的,最初给出的答案是我使用的一种优雅的解决方案:
1
我只是分享在学习和实施过程中所学到的知识。