【问题标题】:JavaScript: Developing a search query for MongoDBJavaScript:为 MongoDB 开发搜索查询
【发布时间】:2019-02-24 18:59:48
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js mongodb electron


    【解决方案1】:

    看来您已经拥有了执行查询所需的所有部分。您只需要根据您的sortProperty 创建sort 选择器。这将是一个对象,其键等于sortProperty 所持有的值,例如age。结果将如下所示

    module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
      return Artist
        .find()
        .sort({ [sortProperty]: 1 })
        .skip(offset)
        .limit(limit);
    };
    

    注意

    为了说明动态键分配,这里有一个 sn-p

    const sortProperty = 'age';
    const selector = { [sortProperty]: 1 };
    
    console.log(selector);

    【讨论】:

    • 再次感谢您的回答。我研究了你的答案几天,因为我一直想知道发生了什么,而不仅仅是答案,我会在你的答案中添加一些附录作为答案。这个思考过程帮助了我,并希望能帮助将来看到这篇文章的其他人。
    【解决方案2】:

    所以上面的答案是最好的解决方案,因为它是 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;
    

    这是一个字符串,我正在尝试将namesortOrder 属性添加到此对象并将其设置为等于1,因此如果您在Chrome 控制台或代码中运行它,最终结果是sn-p 是{ name: 1 }

    我的学习曲线和所选答案帮助我学习的是 ES6 插值属性或键。这件事:

    .sort({ [sortProperty]: 1 })
    

    这里发生的事情是在运行时查看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
      Artist.find()
        .sort({ [sortProperty]: 1 })
        .skip(offset)
        .limit(limit);
    };
    

    我只是分享我在学习和实施它的过程中学到的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 2022-10-05
      • 2021-12-19
      • 2015-06-29
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多