JavaScript:为MongoDB开发搜索查询

时间:2019-02-24 18:59:49

标签: javascript node.js mongodb electron

我需要一些帮助来开发搜索查询,以便为我的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等于年龄,我需要确保我有一条声明说年龄。

2 个答案:

答案 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

我只是分享在学习和实施过程中所学到的知识。